While-Schleife in einer Funktion Abbrechen

  • Hallo Leute :)
    Ich hab ein Problem, ich will eine While Schleife laufen lassen für z.B. eine ProgressBar oderso. Die schleife läuft in eienr Funktion ab. Jetzt soll während das läuft durch ein Abbrechen Button die Funktion bzw. Schleife beendet werden.

    Wenn ich jetzt den GUIOnEventMode verwende geb ich eine Funktion _Cancel() an die aufgerufen wird wenn der Button $Cancel gedrückt wird. Aber was kann ich in der Funktion machen um die Schleife oder Funktion zu beenden???

    [autoit]


    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE ; Schließen
    Exit
    Case $GUI_EVENT_MINIMIZE ; Minimieren
    Minimize()
    Case $Start
    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "Minimize")
    GUICtrlSetOnEvent($Cancel, "_Cancel")

    If Loop($GUI, $string) Then
    MsgBox(0, "Hallo", "...")
    EndIf
    Case $Cancel

    EndSwitch
    WEnd

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

    Func Loop($GUI, $string)
    While 1

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

    GUICtrlSetData($GUI, $string)
    Sleep(100)

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

    ;If GUIGetMsg() = $Cancel Then ExitLoop ; Durch die Sleepverzögerung reagiert da Script nicht sofort auf Cancel-Button
    WEnd
    EndFunc

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

    Func _Cancel()
    ; Was soll ich hier hin?
    EndFunc

    [/autoit]

    Brauche dringend Rat.

  • Aber so klappt das doch nicht
    1. OnEventmode und MsgMode??? Besser doch für eines Entscheiden :D
    2. Ich hoffe ich sag jetzt nix falsches aber meines Wissens ist es unmöglich mit AutoIt von ausserhalb (z.b. durch eine Funkion) eine Schleife zu beenden. Ausser vllt AdlibEnable bzw. AdlibDisable

    MFG FireFlyer

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

  • Aber das kann doch nicht unmöglich sein! :S :P Wie machen den die anderen das??

    Ich könnt ja auch die Abfrage des $cancel Buttons in der Funktion und Schleife machen aber wegen Sleep() regiert die GUi nicht sofort ! :(

  • Du musst dich entscheiden: Entweder OnEvent oder MessageLoop.

    Eine Lösung mit OnEvent wäre, mit globalen Variablen zu arbeiten:

    Spoiler anzeigen
    [autoit]


    Global $abbrechen=False
    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE ; Schließen
    Exit
    Case $GUI_EVENT_MINIMIZE ; Minimieren
    Minimize()
    Case $Start
    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "Minimize")
    GUICtrlSetOnEvent($Cancel, "_Cancel")

    If Loop($GUI, $string) Then
    MsgBox(0, "Hallo", "...")
    EndIf
    Case $Cancel

    EndSwitch
    WEnd

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

    Func Loop($GUI, $string)
    While 1

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

    GUICtrlSetData($GUI, $string)
    Sleep(100)

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

    If $abbrechen Then ExitLoop ;alternativ Return
    WEnd
    EndFunc

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

    Func _Cancel()
    $abbrechen=True
    EndFunc

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Hi,
    natürlich kann man sowohl den Onevent- als auch den Messageloop zusammen verwenden, nur sollte man das nicht gleichzeitig tun, da der Oneventmodus "Vorrang" hat und z.B. Tasten abfängt, die der Messageloop dann nie zu sehen bekommt. Mit

    [autoit]

    Opt('GUIOnEventMode', 0)

    [/autoit]

    könnte man den Oneventmodus (vorrübergehend) ausschalten, per msgloop irgendetwas abfragen und danach den Oneventmodus wieder einschalten. Wer´s unbedingt braucht...
    Allerdings würde ich persönlich einen der beiden Modi vorziehen. Welchen, ist eigentlich Geschmacksache. Denn chaotischen Code produziere ich eigentlich genug, da muss man nicht auch noch mit solchen Konstruktionen nachhelfen^^
    ciao
    Andy

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (31. August 2009 um 09:03)