Das Hauptproblem ist, dass AutoIt-GUIs standardmäßig erstmal nicht mit Double Buffering gerendert werden.
Sprich: Änderungen am Bild werden direkt auf das derzeit angezeigte Bild geschrieben, was dann zum Flackern führt.
Double-Buffering arbeitet hingegen mit 2 Bildern. Dem derzeit angezeigten und einer Kopie davon auf der die Änderungen vorgenommen werden.
Erst wenn diese Änderungen vollständig passiert sind wird das angezeigte direkt mit der bearbeiteten Kopie ausgetauscht.
Dies kann man aber in AutoIt aktivieren - mit der GUI-Option "WS_EX_COMPOSITED".
Damit sollte das Bild schon deutlich ruhiger werden.
Darüber hinaus ist der Aufbau des Zählers nicht ganz glücklich.
Du gehst bei dem aktuellen Skript davon aus, dass jeder Schleifendurchlauf exakt 10ms dauert.
Denn darauf baust du ja deinen Counter auf.
Vermutlich weil du Sleep(10) verwendest.
Das Problem ist jedoch, dass GuiGetMsg() ebenfalls wie ein implizites Sleep wirkt (siehe Hilfe) um CPU-Belastung herunterzufahren.
Daher ist zum einen dein Sleep unnötig, da GuiGetMsg bereits dessen Aufgabe der CPU-Entspannung erledigt und zum anderen ist dein 10er-Counter völlig daneben, was man auch an den angezeigten Werten sieht die nicht mit den Sekunden im Einklang laufen.
Ich habe mal gemessen - bei mir benötigt ein Schleifendurchlauf 30-40ms.
Das +10 bei den Millisekunden kann man sich also schenken.
Daher schlage ich vor, anstatt den Message-Loop-Modus zu verwenden auf den OnEvent-Modus umzuswitchen um das GuiGetMsg() in der Schleife loszuwerden und zum anderen direkt @MSEC zu verwenden anstatt mit diesem Counter herumzuopern:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
; switch to GuiEvent mode
Opt("GUIOnEventMode", 1)
; Define colors explicitly
Local $COLOR_BLACK = 0x000000
Local $COLOR_GREEN = 0x00FF00
; Create main window
$window = GUICreate("System Clock", 350, 150, -1, -1, -1, BitOR($WS_EX_COMPOSITED, $WS_EX_LAYERED))
GUISetBkColor($COLOR_BLACK)
; Create label for time display
$label = GUICtrlCreateLabel("", 50, 40, 250, 60)
GUICtrlSetFont($label, 30, 800, 0, "Arial")
GUICtrlSetColor($label, $COLOR_GREEN)
; associate GUI close event with _exit function
GUISetOnEvent($GUI_EVENT_CLOSE, _exit)
; Show window
GUISetState(@SW_SHOW)
; Main loop
Do
; Update label text
GUICtrlSetData($label, StringFormat("%02d:%02d:%02d.%02d0", @HOUR, @MIN, @SEC, @MSEC / 10))
; Sleep to prevent high CPU usage
Sleep(10)
Until 0
Func _exit()
Exit
EndFunc
Alles anzeigen