OnEvent Problem

  • Hallo,

    auch ich gehöre zu den Leuten, die ein Problem mit dem OnEvent mode haben. Mein Code ist leider zu groß, um ihn zu posten.

    Aber das Problem ist einfach, dass ich einen Unteraufruf habe und einen Mouseklick auf einen Abbruch-Button erst mitbekomme, wenn der Unteraufruf beendet ist.

    Das ist ja nicht der Sinn eines Abbruchbuttons :D

    Nun weiss ich, dass ich das irgendwie umstellen muss, aber ich weiss nicht wie? Die suche im Netz hat mich auch nur verwirrt und nicht weitergebracht.

    Könnt ihr mir weiterhelfen?


    Vielen Dank!

  • Ich verstehe ueberhaupt nicht was dein Problem ist :D, und meine Glaskugeln sind mir leider ausgegangen..
    [Blockierte Grafik: http://smilie-land.de/t/e-h/hexe/hexe0008.gif]
    einfach mal deine Source als Anhang, die au3 wird mit Sicherheit keine 2MB überschreiten ;), denn ohne Source kann ich mir unter deinem Problem nicht wirklich etwas vorstellen..
    nur ca die Hälfte und wie soll ich dir dazu einen brauchbaren Code bzw Lösungsansätze bringen..

    Gruß Marvin

    • Offizieller Beitrag

    Es ist vollkommen normal, das der Abbrechen Button währen einer laufenden Unterfunktion nicht reagiert.
    Programmiertechnisch mußt du es selbst lösen, es gibt ja auch keine Möglichkeit eine laufende Funktion
    von ausserhalb der Funktion zu unterbrechen. Eine laufende Funktion kann sich selbst nur durch Return
    beenden. Die einzige Möglichkeit den Abbrechen Button funtionstüchtig zu halten, ist die Abfrage aus
    WM_COMMAND heraus. Damit kannst du aber höchstens das Script beenden mittels Exit, da es ja keinen
    Befehl gibt um eine Funktion zu stoppen.

    Edit: Die einzige mir sinnvolle Lösung wäre es, die Abzubrechende Funktion als ein Externes Script
    laufen zu lassen, somit kannt du dieses auch abbrechen. In AutoIt kann man halt nicht mit mehreren
    Threads arbeiten, welche unabhängig voneinenader laufen.

  • Du könntest in deiner Unterfunktion regelmäsig eine globale Variable abfragen und dann Return aufrufen, wenn diese gesetzt ist.

    Spoiler anzeigen
    [autoit]

    #Include <Misc.au3>

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

    Global $LeaveFunc = False

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

    HotKeySet("{ESC}", "LeaveFunc")

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

    UnterProgramm()

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

    Func UnterProgramm()
    While 1
    Sleep(500)
    If $LeaveFunc Then Return
    Sleep(500)
    WEnd
    EndFunc

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

    Func LeaveFunc()
    $LeaveFunc = True
    EndFunc

    [/autoit]

    Der Hotkey dient nur der Veranschaulichung, hier solltest du die von Raupi besagte WM_COMMAND nutzen um die Variable zu setzen.

  • Zitat von »Raupi«Es ist vollkommen normal, das der Abbrechen Button währen einer laufenden Unterfunktion nicht reagiertWas ist, wenn diese Unterfunktion nur ein Sleep über 50 Sekunden ist? Gibt es dann keine Möglichkeit?

    Gibt es: du must den Sleep in einer eigen Funktion in kleine Teile stückeln und innerhalb dieser Funktion mit

    [autoit]

    GuiGetMsg

    [/autoit]

    reagieren. Damit GuiGetMsg funktionieren kann muss am Anfang deiner func der OnEventMode ausgeschaltet und am Ende wieder eingeschaltet werden:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 438, 89, 192, 132)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $Loop = GUICtrlCreateButton("Loop-Start", 32, 24, 179, 49)
    GUICtrlSetOnEvent(-1, "Page")
    $Loopinfo = GUICtrlCreateButton("Loop-Stop", 240, 24, 179, 49)
    GUICtrlSetOnEvent(-1, "Stop")
    GUISetState(@SW_SHOW)
    $bStop = True

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

    While 1
    Sleep(10)
    WEnd

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

    Func Page()
    $bStop = False
    _MySleep(Random(100000, 999000,1))
    EndFunc ;==>Page

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

    Func Stop()
    $bStop = True
    ConsoleWrite("STOP" & @CRLF)
    EndFunc ;==>info

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

    Func _MySleep($iMSec)
    Opt("GUIOnEventMode", 0)
    Local $i, $nMsg, $dt = TimerInit()
    Do
    $i += 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Loopinfo
    Stop()
    EndSwitch
    Sleep(10)
    if TimerDiff($dt) > $iMSec Then $bStop = True
    ConsoleWrite($i & @CRLF)
    Until $bStop
    Opt("GUIOnEventMode", 1)
    EndFunc ;==>_MySleep

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    mfg autoBert