Rekursive Funktion per Button beenden

  • Hi habe mir eine funktion geschrieben, die rekursiv ist und über den button 1 gestartet wird...soweit auch kein problem nur möchte ich diese mit dem button 2 beenden, aber nicht das programm schließen. Bekomms aber iwie nicht richtig hin,da ich den passenden befehl nicht finde.
    Ich hoffe ihr könnt mir helfen;)
    Der Code ist jetzt sinngemäß und ganz einfach gehalten...geht mir ums Prinzip ;)

    Spoiler anzeigen

    #include <GUIConstants.au3>

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    $Button1 = GUICtrlCreateButton("Start", 128, 128, 65, 25, 0)
    $Button2 = GUICtrlCreateButton("Stop", 128, 168, 65, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    schreibe()
    Case $Button2
    ;Hier sollte nun die Beendigung erfolgen


    EndSwitch
    WEnd


    Func schreibe()
    Sleep(3000)
    Send("Test")
    Send("{NUMPADENTER}")
    Sleep(3000)
    Send("test2")
    Sleep(3000)
    Send("{NUMPADENTER}")
    Sleep(3000)
    schreibe()
    EndFunc

    3 Mal editiert, zuletzt von loli89 (6. Dezember 2008 um 13:14)

    • Offizieller Beitrag

    Aus einer Rekursion kannst du nicht ausbrechen. Also verwende besser AdlibEnable().

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    $Button1 = GUICtrlCreateButton("Start", 128, 128, 65, 25, 0)
    $Button2 = GUICtrlCreateButton("Stop", 128, 168, 65, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    AdlibEnable('schreibe', 6000)
    Case $Button2
    AdlibDisable() ;Hier sollte nun die Beendigung erfolgen
    EndSwitch
    WEnd

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

    Func schreibe()
    Sleep(3000)
    Send("Test")
    Send("{NUMPADENTER}")
    Sleep(3000)
    Send("test2")
    Sleep(3000)
    Send("{NUMPADENTER}")
    EndFunc

    [/autoit]
  • Hm entweder hab ich noch was übersehen oder da ist bei dem Befehl n Fehler...
    Er startet zwar das Script, schreibt aber trotz betätigens des 2. Buttons weiter.
    Fehlt da nun noch etwas?
    Mfg Loli

    • Offizieller Beitrag

    Bugfix, da sind IMHO zwei Fehler drin. Zum einen funktionieren während eines Sleeps die GUI-Events nicht und zum anderen dauert die Funktion über 9 Sekunden (wird aber durch AdlibEnable alle 6 Sekunden aufgerufen).

    Edit: Der OnEvent-Mode ist dafür besser geeignet:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, 'End')
    $Button1 = GUICtrlCreateButton("Start", 128, 128, 65, 25, 0)
    GUICtrlSetOnEvent(-1, 'start')
    $Button2 = GUICtrlCreateButton("Stop", 128, 168, 65, 25, 0)
    GUICtrlSetOnEvent(-1, 'stop')
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $Enable = False
    While True
    If $Enable Then
    _Sleep(3000)
    Send("Test")
    Send("{NUMPADENTER}")
    _Sleep(3000)
    Send("test2")
    _Sleep(3000)
    Send("{NUMPADENTER}")
    EndIf
    Sleep(10)
    WEnd

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

    Func End()
    Exit
    EndFunc

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

    Func Start()
    $Enable = True
    EndFunc

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

    Func Stop()
    $Enable = False
    EndFunc

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

    Func _Sleep($ms)
    Local $timer = TimerInit()
    While TimerDiff($timer) < $ms
    Sleep(10)
    WEnd
    EndFunc

    [/autoit]

    Hoffentlich wird's nicht wieder nur ein Bot... :S