Что нового

[Элементы GUI] GUICtrlCreateLabel - мерцает при обновлении - ничего не помогает

querubin_new

Новичок
Сообщения
10
Репутация
0
:stars:

Система: Windows XP 32 bit
AutoIt: 3.3.8.1

(проблему решаю около 2-ух недель, думал смогу сам разобраться - не смог)

Перепробовал все варианты которые нашёл на форуме,
http://autoit-script.ru/index.php/topic,3925.0.html#post_gui_1
http://autoit-script.ru/index.php/topic,5632.html и многое другое...
перечитал справку, облазил весь интернет, пробовал, экспериментировал - при обновлении GUICtrlCreateLabel - мерцает, надо, чтобы НЕ мерцал вообще - помогите пожалуйста, код ниже:



Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

HotKeySet("{ESC}", "_Quit_0")
Func _Quit_0()
	Exit 0
EndFunc   ;==>_Quit_0

Global $X = @DesktopWidth / 2 - 147
Global $Y = @DesktopHeight / 2 - 102


$Form1 = GUICreate("", 294, 204, $X, $Y, $WS_POPUP, $WS_EX_TOPMOST)
GUICtrlCreateLabel("", 12, 141, 270, 50, -1) ; граница белого поля
GUICtrlSetBkColor(-1, 0x297C7C)
GUICtrlCreateLabel("", 13, 142, 268, 48, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, "Verdana", 5)
GUICtrlSetColor(-1, 0x297C7C)

Global $sTime_Time_Time = GUICtrlCreateLabel("0", 50, 142, 190, 44, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
Global $backgroundTime = GUICtrlSetBkColor(-1, 0xD3FAFA)
Global $fontTime = GUICtrlSetFont($sTime_Time_Time, 28, 700, Default, "Verdana", 5)
Global $colorTime = GUICtrlSetColor($sTime_Time_Time, 0x297C7C)

GUISetState(@SW_SHOW)

While 1
	GUICtrlSetData($sTime_Time_Time, @HOUR & ":" & @MIN & ":" & @SEC)
	$backgroundTime = GUICtrlSetBkColor(-1, 0xD3FAFA)
	$fontTime = GUICtrlSetFont($sTime_Time_Time, 28, 700, Default, "Verdana", 5)
	$colorTime = GUICtrlSetColor($sTime_Time_Time, 0x297C7C)

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
querubin_new,
Вы слишком часто обновляете данные.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

HotKeySet('{ESC}', '_Quit_0')

Global $X = @DesktopWidth / 2 - 147
Global $Y = @DesktopHeight / 2 - 102

$hForm = GUICreate('', 294, 204, $X, $Y, $WS_POPUP, $WS_EX_TOPMOST)
GUICtrlCreateLabel('', 12, 141, 270, 50, -1) ; граница белого поля
GUICtrlSetBkColor(-1, 0x297C7C)
GUICtrlCreateLabel('', 13, 142, 268, 48, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, 'Verdana', 5)
GUICtrlSetColor(-1, 0x297C7C)

$nTime = GUICtrlCreateLabel('0', 50, 142, 190, 44, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, 'Verdana', 5)
GUICtrlSetColor(-1, 0x297C7C)
_NewTime()
GUISetState()
AdlibRegister('_NewTime', 100)
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _NewTime()
	Local Static $s__Sec = -1
	If $s__Sec <> @SEC Then
		GUICtrlSetData($nTime, @HOUR & ':' & @MIN & ':' & @SEC)
		$s__Sec = @SEC
	EndIf
EndFunc   ;==>_NewTime

Func _Quit_0()
	Exit 0
EndFunc   ;==>_Quit_0
Или так можно
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

HotKeySet('{ESC}', '_Quit_0')

Global $X = @DesktopWidth / 2 - 147, $Y = @DesktopHeight / 2 - 102
Global Static $s__Sec = -1

$hForm = GUICreate('', 294, 204, $X, $Y, $WS_POPUP, $WS_EX_TOPMOST)
GUICtrlCreateLabel('', 12, 141, 270, 50, -1) ; граница белого поля
GUICtrlSetBkColor(-1, 0x297C7C)
GUICtrlCreateLabel('', 13, 142, 268, 48, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, 'Verdana', 5)
GUICtrlSetColor(-1, 0x297C7C)

$nTime = GUICtrlCreateLabel('0', 50, 142, 190, 44, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, 'Verdana', 5)
GUICtrlSetColor(-1, 0x297C7C)
GUISetState()

While 1
	If $s__Sec <> @SEC Then
		GUICtrlSetData($nTime, @HOUR & ':' & @MIN & ':' & @SEC)
		$s__Sec = @SEC
	EndIf
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Quit_0()
	Exit 0
EndFunc   ;==>_Quit_0
 
Автор
querubin_new

querubin_new

Новичок
Сообщения
10
Репутация
0
спасибо, сейчас буду пробовать


Добавлено:
Сообщение автоматически объединено:

Огромное спасибо - попробовал 1-й и 2-ой вариант - так намного лучше! но, мигание раз в 2-3 минуты всё-таки присутствует - видимо, это ещё и проблема самого AutoIt.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Или добавить кое-что, чтобы реже обновлялся
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

HotKeySet("{ESC}", "_Quit_0")
Func _Quit_0()
    Exit 0
EndFunc   ;==>_Quit_0

Global $X = @DesktopWidth / 2 - 147
Global $Y = @DesktopHeight / 2 - 102


$Form1 = GUICreate("", 294, 204, $X, $Y, $WS_POPUP, $WS_EX_TOPMOST)
GUICtrlCreateLabel("", 12, 141, 270, 50, -1) ; граница белого поля
GUICtrlSetBkColor(-1, 0x297C7C)
GUICtrlCreateLabel("", 13, 142, 268, 48, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
GUICtrlSetBkColor(-1, 0xD3FAFA)
GUICtrlSetFont(-1, 28, 700, Default, "Verdana", 5)
GUICtrlSetColor(-1, 0x297C7C)

Global $sTime_Time_Time = GUICtrlCreateLabel("0", 50, 142, 190, 44, -1) ; белое поле (ТУТ БУДЕТ ВРЕМЯ)
Global $backgroundTime = GUICtrlSetBkColor(-1, 0xD3FAFA)
Global $fontTime = GUICtrlSetFont($sTime_Time_Time, 28, 700, Default, "Verdana", 5)
Global $colorTime = GUICtrlSetColor($sTime_Time_Time, 0x297C7C)

GUISetState() ;(@SW_SHOW)

While 1
	$s = @SEC
    GUICtrlSetData($sTime_Time_Time, @HOUR & ":" & @MIN & ":" & @SEC)
    $backgroundTime = GUICtrlSetBkColor(-1, 0xD3FAFA)
    $fontTime = GUICtrlSetFont($sTime_Time_Time, 28, 700, Default, "Verdana", 5)
    $colorTime = GUICtrlSetColor($sTime_Time_Time, 0x297C7C)
	
	While $s = @SEC
	WEnd

    $nMsg = GUIGetMsg()
    Switch $nMsg
       Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
ildar [?]
Код:
While $s = @SEC
    WEnd

Ничего что это напрягает процессор на полную катушку?
 

ildar

Осваивающий
Сообщения
252
Репутация
29
А так ему будет полегче?
Код:
While $s = @SEC
        Sleep(100)
    WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
ildar [?]
А так ему будет полегче?
Так легче но окно не будет реагировать на кнопки. Смысл не в том сколько ждать, сам GUIGetMsg уже вставляет задержку, смысл в том чтобы не обновлять Label до тех пор пока это не потребуется. Как только информация о секунде не равна предыдущей так сразу обновить. Тогда обновление будет 1 раз в секунду, реже уже нельзя. Я в секундомере делал раздельные Label, чтобы Label с часами обновлять 1 раз в час, Label с минутами 1 раз в минуту. Но причина в использовании миллисекунд, благодаря этому обновлялась минимальная площадь. Но для 1 раза в секунду это излишне.
 

_ToBe_

Осваивающий
Сообщения
142
Репутация
35
Помню помню :smile: Тоже делал часики, тоже сталкивался с этим :smile:
В общем я решил вопрос через Таймеры
Код:
TimerInit()
TimerDiff()


вот фрагмент кода:

Код:
Func _start_timer()
	$timer = TimerInit()
	$sec = 0
	$min = 0
	$hour = 0
	While 1
		$msg = GUIGetMsg()
		If $msg = $GUI_EVENT_CLOSE Then Exit
		$sec = Int(TimerDiff($timer)/1000)
		If $sec < 10 Then
			GUICtrlSetData($timer_sec, "0" & $sec)
		Else
			GUICtrlSetData($timer_sec, $sec)
		EndIf

		If $sec > 59 Then
			$timer = TimerInit()
			$min = $min+1
			If $min < 10 Then
				GUICtrlSetData($timer_min,"0" & $min)
			Else
				GUICtrlSetData($timer_min, $min)
			EndIf
		EndIf
    wend
endfunc


Если что-то не понятно в коде, спрашивай откоментирую :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
_ToBe_
Если что-то не понятно в коде, спрашивай откоментирую
Спрашиваю... Зачем обновлять Label каждые 10 миллисекунд?
Код:
If $sec < 10 Then
            GUICtrlSetData($timer_sec, "0" & $sec)
        Else
            GUICtrlSetData($timer_sec, $sec)
        EndIf

Смотрите пример madmasles
 

_ToBe_

Осваивающий
Сообщения
142
Репутация
35
AZJIO
Это не обновление каждые 10мс, это если секунд меньше 10, к примеру 8, то выглядеть будет так
"00:00:8" а нужно "00:00:08" :smile: т.е. он просто дорисовывает "0" перед значением, если оно меньше 10
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
_ToBe_
Если вы кэшируете данные в переменную, то да, но вызов GUICtrlSetData обновляет конкретный элемент. Так что обновляете элемент "Секунды" каждые 10 миллисекунд. Лучше обновлять раз в секунду и лучше данные брать с системного времени, а не использовать внутренний счёт, в котором нужна уверенность с синхронизацией текущего времени на 100%. Ваш вариант больше подходит к таймеру, а не к часам. Хотя я бы запрашивал время каждые 250 или 500 мсек, потому что если произойдёт рассинхронизация запроса и первый запрос будет на границе а второй тоже на границе по другой стороне, то наблюдается эффект сбоев, поэтому 4 раза в секунду сгладит визуальный эффект. Если обновление секунд произойдёт с промежутком 750 миллисекунд, это не будет заметно.
 
Верх