Nun die Überschrift sagt schon alles .
Ist GUICtrlSetOnEvent schneller als eine While + GUIGetMsg -Loop?
-
-
Also ich würde sagen JA. Den Unterschied wirst du aber erst bei sehr vielen Ctrls bemerken.
Generell finde ich den OnEvent Modus eine sehr feine sache das einzig blöde ist das man
1. keine Parameter übergeben kann (oder ich war bisher zu doof dafür )
2. keine Standardfunktionen benutzen kann (z.b. Exit man muss dafür erst ne Func schreiben)Was ich aber noch viel feiner find als den OnEventMode ist der WM_COMMAND
Das ist zwar ein bissl mehr arbeit beim Coden und am Anfang auch irgendwie net so leicht zu blicken aber wenn man es mal raus hat bieten sich einem ungeheure Möglichkeiten
Nicht nur die 2 oben genannten Punkte fallen hierbei weg sondern man kann auch auf verschiedene Aktionen des Users reagieren.
z.B. User macht einen Klick in ein ListView (kann man sowohl mit GetMsg als auch mit OnEvent abfragen)
Mit dem WM_COMMAND kann man nun aber auch Doppelklicks, Focus, Defocus uvm. abfragen, das ist wirklich genialAn dieser Stelle nochmal ein dickes Dankeschön an Xeno, mit seiner Hilfe hatte ich mir meinen ersten WM_COMMAND gebaut (zum Autoausfüllen von Combos)
-
- Offizieller Beitrag
Auch wenn ich lieber im OnEvent-Mode arbeite - rein unter Betrachtung des Codes sehe ich keinen Grund, warum die Modi unterschiedliche Speed haben sollten. Hier könnte sogar der OnEvent-Mode Zeit verlieren, wenn das Sleep() in der While-Schleife mehr Zeit frißt als GuiGetMsg() benötigt.
-
- Offizieller Beitrag
Hmmm...war es früher nicht mal so, dass der Sleepwert in der Endlosschleife die Reaktionzeit der Events beeinflusst hat?
Sprich: Man durfte den Wert nicht zu groß wählen, weil dann die Events (z.B. Buttonklick) erst später ausgeführt wurden?
Ich hab das gerade mal ausgetestet:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
Opt('GUIOnEventMode', 1)
GUICreate('Test', 400, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
GUICtrlCreateButton('Testbutton', 30, 30, 100, 25)
GUICtrlSetOnEvent(-1, '_Button')
GUISetState()While True
[/autoit] [autoit][/autoit] [autoit]
Sleep(100000)
WEndFunc _End()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc _Button()
[/autoit]
MsgBox(0, 'Test', 'Test')
EndFunc
Trotz des hohen Sleepwerts reagiert der Button sofort. Oder war das schon immer so und es ist mir jetzt erst aufgefallen?Was mich am MessageLoop-Modus stört ist die dynamische Rechenzeit-Zuweisung. Wenn der User z.B. die Maus bewegt, wird dem Script mehr Rechenzeit zugewiesen (die Schleife wird öfter ausgeführt).
Ein kleines Beispielscript verdeutlicht dieses:Spoiler anzeigen
[autoit]
[/autoit]
#include <GUIConstantsEx.au3>
GUICreate('Test', 400, 200)
$hCount = GUICtrlCreateLabel('0', 30, 30, 100, 25)
GUISetState()
Do
GUICtrlSetData($hCount, GUICtrlRead($hCount) + 1)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Der Zähler läuft schneller, wenn die Maus bewegt wird. -
Hi,
dann ist doch der OnEventMode schneller (jedenfalls innerhalb des Loop´s ) oder habe ich jetzt einen Denkfehler?
Denn so läuft der Zähler immer mit voller Geschwindigkeit:Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
Opt('GUIOnEventMode', 1)GUICreate('Test', 400, 200)
[/autoit] [autoit][/autoit] [autoit]
$hCount = GUICtrlCreateLabel('0', 30, 30, 100, 25)GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateButton('Testbutton', 100, 100, 100, 25)
GUICtrlSetOnEvent(-1, '_Button')
GUISetState()Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($hCount, GUICtrlRead($hCount) + 1)
Until 0 ;GUIGetMsg() = $GUI_EVENT_CLOSEfunc _Button()
[/autoit] [autoit][/autoit] [autoit]
endfuncfunc _end()
[/autoit]
exit
endfuncIm Endeffekt geht es doch nur um die interne Zeit zur Abfrage des "Events". Und wie es aussieht, ist die beim OnEventMode kürzer, von den gleichzeitigen Mausbewegungen bei Oscar´s Beispiel mal abgesehen. Denn wenn ich einen Button klicken möchte, dann steht der Mauszeiger vor dem Klick sowieso sehr lange still (in den Zeitdimensionen des Rechners gesehen).
-
Was ist, wenn man eine GUI mit sehr vielen Ctrls hat? Welche Variante wäre da sinnvoller?
-
Hi,
gerade mit sehr vielen Controls halte ich den Oneventmode für übersichtlicher.
In Scite einmal Alt+L (Funktionsliste) und Doppelklick, schwupp bist du "in" der Funktion, aber such mal nach einer Controlvariablen in einer3-seitigen Select-Anweisung... -
Also beim MsgMode fragt ja autoit alle Controls ab ob gerade eine Akion von denen Ausging
Beim OnEventMode sendet das Control einen interrupt und startet die funktion (stimmt das so in etwa?)
der WM command funktioniert wohl ganz ähnlich nur da muss man dann noch abfragen welches Control betroffen ist und auch wie (was für eine Aktion)Ist GUICtrlSetOnEvent ein vereinfachter WM_COMMAND???
-
Zitat
Ist GUICtrlSetOnEvent ein vereinfachter WM_COMMAND
Ja, denn die "normalen" (üblichen) Events (Mausklick, Tastendruck) werden dadurch abgefangen. Mit den vielen Windows-Nachrichtencodes (einer davon ist WM_Command) kannst du nun alle möglichen Nachrichten abfangen. Um ein Mausrad abzufragen verwendet man dann den WM_Mausrad usw.
Interessant ist an der Sache, daß man selbst Nachrichten generieren und versenden kann, diese werden dann wie die "richtigen" WindowsMessages abgearbeitet. So lassen sich auch Infos zwischen verschiedenen (AutoIt)-Programmen austauschen.