Programm "vorzeitig" beenden

  • Hi,

    angenommen eine while-Schleife führt 20 Durchgänge aus.
    Nach 10 Durchgängen klickt man auf Beenden.
    Dann wird trotzdem erst das Programm nach dem Ende der 20 Durchgänge beendet.
    Wie kann man schon vorher auf dem Eventhandler prüfen bzw. das Programm beenden?

    Grüße und Danke

    Guido

  • Hm,

    in der Hilfe finde ich nur AdlibEnable("Funktion"), aber mit dem Beispiel komme ich nicht klar.

    Ein Beispiel sagt mehr als 1000 Worte.
    Das Beispielprogramm macht 10 Wiederholungen. Wenn man das Programm nach 5 Läufen beenden möchte, passiert nichts, bis die 10 Läufe durch sind.

    Spoiler anzeigen
    [autoit]


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

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

    ;Fenster erstellen
    GUICreate("Programm vorzeitig beenden", 520, 360)
    GUISetBkColor("0xFFFFCA")
    GUISetFont(9, 400, 0, "Arial")

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

    Global $lauf
    ;Fenster aufrufen
    GUISetState(@SW_SHOW)

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

    GUICtrlCreateLabel("Anzahl Läufe: 10", 10, 40)
    $lauf = GUICtrlCreateLabel("Lauf:", 10, 80,100,20)
    _repeat()

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

    $msg = 0
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    Func _repeat()
    Local $i
    for $i = 0 to 10
    guICtrlSetData($lauf,"Lauf: " & $i)
    sleep (1000)
    Next
    EndFunc

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

    Exit

    [/autoit]
    • Offizieller Beitrag
    Beispiel
    [autoit]

    Global $count = 0, $max = 20 ; $max ist die maximale Anzahl der Durchläufe (Aufrufe)
    AdlibEnable('_msg', 1000) ; alle 1000 ms wird das Programm aufgerufen
    HotKeySet('!e', '_ende') ; Hotkey zum vorzeitigen Beenden: ALT + e

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

    While 1
    Sleep(100)
    WEnd

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

    Func _msg()
    $count += 1
    ConsoleWrite('Message #' & $count & @CRLF)
    If $count = $max Then
    AdlibDisable()
    Exit
    EndIf
    EndFunc

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

    Func _ende()
    ConsoleWrite("vorzeitig beendet" & @CRLF)
    AdlibDisable()
    Exit
    EndFunc

    [/autoit]
  • Ich habe das jetzt mal in mein Demo-Programm umgesetzt, aber mit der Lösung erreiche ich immer noch nicht mein Ziel :(
    Mit Alt+e kann ich zwar den Lauf unterbrechen, der nach dem Klick auf der Gui aber weiter läuft. Auch wird ein erneutes Drücken des Start-Buttons dabei ignoiert.
    Außerdem ruft "AdlibEnable" die Funktion "repeat" nach ihrem Durchlauf immer wieder erneut auf.

    Mein eigentliches Ziel erreiche ich aber immer noch nicht.
    a) ein wirklicher Abbruch der Funktion
    b) nach der "Unterbrechung" der Funktion, die Möglichkeit haben das Programm zu beenden

    Spoiler anzeigen
    [autoit]


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

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

    ;Fenster erstellen
    GUICreate("Programm vorzeitig beenden", 520, 360)
    GUISetBkColor("0xFFFFCA")
    GUISetFont(9, 400, 0, "Arial")

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

    Global $lauf
    ;Fenster aufrufen
    GUISetState(@SW_SHOW)

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

    HotKeySet('!e', '_ende') ; Hotkey zum vorzeitigen Beenden: ALT + e

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

    GUICtrlCreateLabel("Anzahl Läufe: 10", 10, 40)
    $lauf = GUICtrlCreateLabel("Lauf:", 10, 80,100,20)
    $btn_Start = GUICtrlCreateButton("Start", 270, 50, 60, 20)

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

    $msg = 0
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $btn_Start
    AdlibEnable('_repeat', 1000)
    EndSelect

    WEnd

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

    Func _repeat()
    Local $i
    for $i = 0 to 10
    guICtrlSetData($lauf,"Lauf: " & $i)
    sleep (1000)
    Next
    EndFunc

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

    Func _ende()
    ConsoleWrite("vorzeitig beendet" & @CRLF)
    AdlibDisable()
    EndFunc

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

    Exit

    [/autoit]
  • Spoiler anzeigen
    [autoit]

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

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

    ;Fenster erstellen
    GUICreate("Programm vorzeitig beenden", 520, 360)
    GUISetBkColor("0xFFFFCA")
    GUISetFont(9, 400, 0, "Arial")

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

    Global $lauf, $count = 1
    ;Fenster aufrufen
    GUISetState(@SW_SHOW)

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

    HotKeySet('!e', '_ende') ; Hotkey zum vorzeitigen Beenden: ALT + e

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

    GUICtrlCreateLabel("Anzahl Läufe: 10", 10, 40)
    $lauf = GUICtrlCreateLabel("Lauf:", 10, 80,100,20)
    $btn_Start = GUICtrlCreateButton("Start", 270, 50, 60, 20)

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

    $msg = 0
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $btn_Start
    AdlibEnable('_repeat', 1000)
    EndSelect

    WEnd

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

    Func _repeat()
    guICtrlSetData($lauf,"Lauf: " & $count)
    $count += 1
    If $count = 10 Then AdlibDisable()
    EndFunc

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

    Func _ende()
    ConsoleWrite("vorzeitig beendet" & @CRLF)
    AdlibDisable()
    EndFunc

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

    Exit

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)