OnEvent in sich aufrufenden Funktionen

  • Hi,

    ich versuche gerade in einer Funktion ein GUICtrlSetOnEvent verstehe aber nicht ganz warum das nur teilweise geht.

    Folgendes Script geht:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    Opt("GuiOnEventMode", 1)

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

    $Gui = GUICreate("Beispiel", 100, 100)
    GUISetState(@SW_SHOW)

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

    $starten = GUICtrlCreateButton("start", 0, 0)
    GUICtrlSetOnEvent(-1, "start")

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

    $test = GUICtrlCreateButton("test", 0, 80)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    start()

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

    While 1
    Sleep(100)
    WEnd

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

    Func start()
    MsgBox(0, "", "Funktion start")
    GUICtrlSetState(-1, $GUI_SHOW)
    GUICtrlSetOnEvent(-1, "test")
    While 1
    Sleep(100)
    WEnd
    EndFunc ;==>start

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

    Func test()
    MsgBox(0, "", "Funktion test")
    EndFunc ;==>test

    [/autoit]

    Sprich beim Klicken auf den Button "start" wird die "start"-Funktion ausgeführt und beim klick auf den Button "test" wird die "test"-Funktion ausgeführt.

    Wenn ich aber nun das Separate aufrufen von "start" vor der while entferne wird zwar weiterhin beim klick auf den Button "start" die "start"-Funktion ausgeführt aber die "test"-Funktion nichtmehr:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    Opt("GuiOnEventMode", 1)

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

    $Gui = GUICreate("Beispiel", 100, 100)
    GUISetState(@SW_SHOW)

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

    $starten = GUICtrlCreateButton("start", 0, 0)
    GUICtrlSetOnEvent(-1, "start")

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

    $test = GUICtrlCreateButton("test", 0, 80)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;~ start()

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

    While 1
    Sleep(100)
    WEnd

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

    Func start()
    MsgBox(0, "", "Funktion start")
    GUICtrlSetState($test, $GUI_SHOW)
    GUICtrlSetOnEvent($test, "test")
    While 1
    Sleep(100)
    WEnd
    EndFunc ;==>start

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

    Func test()
    MsgBox(0, "", "Funktion test")
    EndFunc ;==>test

    [/autoit]

    Ich steh total auf dem Schlauch, warum das nicht geht.


    Edit: Die While in der "start" soll drin bleiben

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Genau wegen der while-schleifen in deinem start(). Er "hängt" dann in der WhileSchleife.
    Wenn du diese auskommentierst, funktioniert das Script.

    Spoiler anzeigen
    [autoit]


    #include<GUIConstantsEx.au3>
    Opt("GuiOnEventMode", 1)

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

    $Gui = GUICreate("Beispiel", 100, 100)
    GUISetState(@SW_SHOW)

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

    $starten = GUICtrlCreateButton("start", 0, 0)
    GUICtrlSetOnEvent(-1, "start")

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

    $test = GUICtrlCreateButton("test", 0, 80)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;~ start()

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

    While 1
    Sleep(100)
    WEnd

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

    Func start()
    MsgBox(0, "", "Funktion start")
    GUICtrlSetState($test, $GUI_SHOW)
    GUICtrlSetOnEvent($test, "test")
    ;While 1
    ; Sleep(100)
    ;WEnd
    EndFunc ;==>start

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

    Func test()
    MsgBox(0, "", "Funktion test")
    EndFunc ;==>test

    [/autoit]


    Was möchtest du den mit der While Schleife realisieren?

  • Was mir halt nicht klar ist, warum Beispiel 1 funktioniert. Weil dort müsste er ja auch in der While-Schleife hängen bleiben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Das funktioniert auch nur zufällig (einmalig).
    In der Funktion "Start" wird jedes mal eine neue while 1 ... Wend Schleife begonnen und diese wird nie verlassen.
    Fazit: Die While ... Wend Schleife muss aus der Funktion.
    Ist ähnlich wie bei "GUIRegisterMsg"

  • Mich interessiert ja aber der Grund, warum es einmal Funktioniert :D. Muss ja einen Grund haben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hat auch einen Grund. Es klappt solange bis du 2mal start betätigst. Du loopst while-schleifen hinter while-schleifen (mit jemals Sleep(100)) also reagiert das script gar nicht mehr (sleeped durchgehend, dabei wechseln sich 1. start() und 2. start() nacheinander ab). Zumindest ovn meinem verständnis her.

    So funktionierts jedoch:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    Opt("GuiOnEventMode", 1)
    Global $laeuft

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

    $Gui = GUICreate("Beispiel", 100, 100)
    GUISetState(@SW_SHOW)

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

    $starten = GUICtrlCreateButton("start", 0, 0)
    GUICtrlSetOnEvent(-1, "start")

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

    $stoppen = GUICtrlCreateButton("stop", 50, 0)
    GUICtrlSetOnEvent(-1, "stop")

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

    $test = GUICtrlCreateButton("test", 0, 80)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;start()

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

    While 1
    Sleep(100)
    While $laeuft
    Sleep(100)
    WEnd
    WEnd

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

    Func start()
    If $laeuft = False Then
    $laeuft = True
    MsgBox(0, "", "Funktion start")
    If GuiCtrlGetState(-1) = 96 Then
    GUICtrlSetState(-1, $GUI_SHOW)
    GUICtrlSetOnEvent($test, "test")
    EndIf
    EndIf
    EndFunc ;==>start

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

    Func test()
    MsgBox(0, "", "Funktion test")
    EndFunc ;==>test

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

    Func stop()
    If $laeuft = True Then
    $laeuft = False
    MsgBox(0, "", "Funktion gestoppt")
    GuiCtrlSetState($test,$GUI_HIDE)
    EndIf
    EndFunc ;==>stop

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

    Jetzt hast du (indirect) deine While-Schleife mit deiner start() Funktion verknüpft

    Edit: okay code bearbeitet

    2 Mal editiert, zuletzt von draien (15. Januar 2015 um 16:38)

    • Offizieller Beitrag

    Beim OnEventMode musst Du die Funktion, die per Event aufgerufen wird, wieder verlassen (dort darf keine Dauerschleife drin sein).
    Für die Zeit, die von der aufgerufenen Funktion benötigt wird, funktionieren die anderen Events nicht mehr. Im Extremfall kommt dann von Windows die Meldung, dass das Programm nicht mehr reagiert.
    Wie "draien" das schon richtig gezeigt hat, müsstest Du das in die "Warteschleife" im Hauptteil verlagern.

    Dein Beispiel 1 im ersten Post funktioniert, weil Du die Funktion "start" direkt aufrufst (ohne Event). Beim Klick auf den Button wird dann aber ein Event ausgelöst und in die Funktion gesprungen. Solange wie die Funktion dann ausgeführt wird, ist der EventMode blockiert.

  • Ah ok danke Oscar das klärt meine Frage :).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.