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 genial :)

    An 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)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (13. August 2009 um 02:25)

    • 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. :D

    • 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]


    #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()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(100000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Button()
    MsgBox(0, 'Test', 'Test')
    EndFunc

    [/autoit]


    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]


    #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

    [/autoit]


    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>
    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate('Test', 400, 200)
    $hCount = GUICtrlCreateLabel('0', 30, 30, 100, 25)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUICtrlCreateButton('Testbutton', 100, 100, 100, 25)
    GUICtrlSetOnEvent(-1, '_Button')
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    GUICtrlSetData($hCount, GUICtrlRead($hCount) + 1)
    Until 0 ;GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _Button()
    endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func _end()
    exit
    endfunc

    [/autoit]

    Im 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).

  • 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???

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • 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.