while schleife abbrechen

  • hi coder =p

    ich bin schreiben eines scriptes, dass sich endlos wieedrholt bis ein button betätigt wird, der die endlosschleife beenden soll. das problem hierbei, es wird nicht beendet. hier der vereinfachte quelltext.

    [autoit]


    #include <GUIConstants.au3>
    #include <Array.au3>

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

    Dim $abbruch
    ;GUI

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Func1 ()
    Case $Button2
    _Func2 ()
    EndSwitch
    WEnd

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

    Func _Func1 ()
    $abbruch = 1
    EndFunc

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

    Func _Func2 ()
    $abbruch = 0
    $cooldown = GUICtrlRead($Input1)
    $Timer = TimerInit()
    While 2
    if $abbruch = 1 Then
    ExitLoop
    Else
    If TimerDiff($Timer) > $cooldown*1000 Then
    ; [...]
    EndIf
    EndIf
    WEnd
    EndFunc

    [/autoit]

    hat jemand eine idee wo der fehler steckt?

    mfg bocky

    2 Mal editiert, zuletzt von bocky3 (4. Oktober 2008 um 22:04)

  • die erste while schleife überprüft die buttons und verweist auf die funktionen.
    die zweite whileschleife wird durchaus angesprochen, zumal es um die 2te while schleife geht, die sich nicht abbrechen lässt.
    im endeffekt ruft man eine schleife in eienr schleife auf, die die erste whileschleife aushebelt.
    dadurch lässt sie sich nicht abbrechen und da liegt das problem und ich hab das spriochwörtliche brett vor dem kopf.

    die bedingung des programms ist, dass es eine endlosschleife ergibt, bis man es abbricht - eine art timer

  • Exit beendet das gesamte Programm.
    ExitLoop hingegen beendet eine aktuelle Schleife

    Turbolocke
    Ja geht
    While arbeitet mit einem booleschen Ausdruck - also wahr oder falsch.
    Wird eine Zahl stattdessen angegeben wird diese erst in einen booleschen Ausdruck umgewandelt wobei dabei eine 0 false bedeutet und alle anderen Zahlen true.
    2 wird also zu true und wir erhalten unsere While-Endlosschleife.

    Edit: So nochmal genauer angesehen und festgestellt das es doch um etwas anderes geht.
    Das Problem ist das $abbruch innerhalb der Schleife nie auf 1 gesetzt wird.
    Solange diese Schleife läuft werden keine Messages mehr ausgewertet weil die MessageLoop ja erst wartet bis _Func2() fertig ist bevor sie weiter prüft.
    _Func1 wird also nicht aufgerufen auch wenn du den Button drückst.

    Du solltest also eher probieren die Abfrage des Button 1 noch mit in die 2. Schleife zu packen bzw. mal alternativ mit AdlibEnable() rumprobieren.
    Noch eine Alternative wäre vom MessageLoop-Modus wegzugehen und den GuiOnEvent-Modus zu nutzen. (könnte aber sein das du in die 2. Schleife noch ein minimales Sleep mit einbauen musst um kleine Atempausen zu schaffen;-))

    4 Mal editiert, zuletzt von AspirinJunkie (19. September 2008 um 18:13)

  • Du solltest also eher probieren die Abfrage des Button 1 noch mit in die 2. Schleife zu packen

    ich sags ja - brett vor dem kopf, danke ^^

    lösung:

    [autoit]


    While 2
    if $Button5 Then
    ExitLoop
    Else
    If TimerDiff($Timer) > $cooldown*1000 Then
    ; [...]
    EndIf
    EndIf
    WEnd

    [/autoit]

    theoretisch könnte ich auch die gesamte while schleife mit AdlibEnable() auslagern, wenn ich es richtig aus der hilfe herausgelesen habe, aber faulheit lässt grüßen. :rolleyes:

    danke nochmals =)

    mfg bocky

  • ich muss den thread leider nocheinmal wiederbeleben.

    und zwar dachte ich man könne eine while schleife mit einer switch bzw select anweisung unterbrechen, indem diese die buttonaktivität überprüfen und den abbruch erzwingen. leider ohne erfolg.

    beispielcode:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=E:\AutoIt\while abbrechen\Form1.kxf
    $Form1 = GUICreate("test", 141, 54, 209, 136)
    $go = GUICtrlCreateButton("go", 0, 24, 97, 25, 0)
    GUICtrlSetOnEvent(-1, "_Func1")
    $Stop = GUICtrlCreateButton("Stop", 104, 0, 33, 49, 0)
    $Input1 = GUICtrlCreateInput("1", 0, 0, 97, 21)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Func3")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Func3")
    GUISetOnEvent($GUI_EVENT_RESTORE, "_Func3")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    sleep(500)
    WEnd

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

    Func _Func1()
    $Timer = TimerInit()
    While 2
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $Stop
    ExitLoop
    EndSelect
    if TimerDiff($Timer) > GUICtrlRead($Input1)*1000 Then
    MsgBox(0, "test", TimerDiff($Timer))
    $Timer = TimerInit()
    EndIf
    WEnd
    EndFunc

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

    Func _Func3 ()

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

    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit

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

    Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

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

    Case @GUI_CtrlId = $GUI_EVENT_RESTORE

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

    EndSelect
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Hallo.


    Wo in deinem Script rufst du _Func1 und _Func3 auf ? Hehe. Hab Tomaten auf den Augen.

    Soviel ich bis jetz mitbekommen habe gehen GUIOnEventMode und GUIGetMsg zusammen überhaupt nicht.

  • _func1 wird hiermit aufgerufen:

    [autoit]


    $go = GUICtrlCreateButton("go", 0, 24, 97, 25, 0)
    GUICtrlSetOnEvent(-1, "_Func1")

    [/autoit]

    _func3 sind die speacial events, minimieren, schließen usw.

    du hattest recht, huigetmsg() ist inkopatibel mit guionevent.
    schreibe ich es normal um funktioniert es.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    ;Opt("GUIOnEventMode", 1)

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

    #Region ### START Koda GUI section ### Form=E:\AutoIt\while abbrechen\Form1.kxf
    $Form1 = GUICreate("test", 141, 54, 209, 136)
    $go = GUICtrlCreateButton("go", 0, 24, 97, 25, 0)
    ;GUICtrlSetOnEvent(-1, "_Func1")
    $Stop = GUICtrlCreateButton("Stop", 104, 0, 33, 49, 0)
    $Input1 = GUICtrlCreateInput("1", 0, 0, 97, 21)
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "_Func3")
    ;GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Func3")
    ;GUISetOnEvent($GUI_EVENT_RESTORE, "_Func3")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    ; sleep(500)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $go
    _Func1 ()
    EndSwitch
    WEnd

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

    Func _Func1()
    $Timer = TimerInit()
    While 2
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $Stop
    ExitLoop
    EndSelect
    if TimerDiff($Timer) > GUICtrlRead($Input1)*1000 Then
    MsgBox(0, "test", TimerDiff($Timer))
    $Timer = TimerInit()
    EndIf
    WEnd
    EndFunc

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

    ;Func _Func3 ()

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

    ; Select
    ; Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    ; Exit

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

    ; Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE

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

    ; Case @GUI_CtrlId = $GUI_EVENT_RESTORE

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

    ; EndSelect
    ;EndFunc

    [/autoit]

    hat jmd eine idee wie man es für guionevent lösen könnte?

    • Offizieller Beitrag

    Wenn ich jetzt richtig verstanden habe willst du dein Scrip endlos laufen lassen das nur unterbrochen wird wenn du en Button drückst aber erst nachdem der go button gedrückt wurde. Was soll das Script denn genau machen?

  • ist doch egal was in der while schleife steht, es wird bis zu abbruchsbedingung endlos wiederholt ;)

    kopier das letzte angegebene beispiel in autoit ein. es erzeugt jede sekunde eine msg box, die die intervallzeit ausgibt.

    wäre nur schön, wenn jmd eine idee für die abbruchbedingung mit guionevent hätte. zur zeit fühl ich mich da wie eine schildkröte, die auf dem rücken liegt. ^^

    • Offizieller Beitrag

    Mit GUIEventMode hab ich noch nix gemacht . Ich find dein Script aber en bischen kompliziert. Hab dein Script umgeschrieben und es macht das was du beschrieben hast .

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Global $Timerstart
    ;Opt("GUIOnEventMode", 1)
    $Timerstart = 0
    #Region ### START Koda GUI section ### Form=E:\AutoIt\while abbrechen\Form1.kxf
    $Form1 = GUICreate("test", 141, 54, 209, 136)
    $go = GUICtrlCreateButton("go", 0, 24, 97, 25, 0)
    ;GUICtrlSetOnEvent(-1, "_Func1")
    $Stop = GUICtrlCreateButton("Stop", 104, 0, 33, 49, 0)
    $Input1 = GUICtrlCreateInput("1", 0, 0, 97, 21)
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "_Func3")
    ;GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Func3")
    ;GUISetOnEvent($GUI_EVENT_RESTORE, "_Func3")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    ; sleep(500)
    $nMsg = GUIGetMsg()
    Select
    Case $nmsg=$GUI_EVENT_CLOSE
    Exit
    Case $nmsg = $go
    $Timerstart = 1
    $Timer = TimerInit()
    Case $nMsg = $Stop
    $Timerstart = 0
    EndSelect

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

    if $Timerstart = 1 and TimerDiff($Timer) > GUICtrlRead($Input1)*1000 Then
    MsgBox(0, "test", TimerDiff($Timer))
    $Timer = TimerInit()
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • ich finde deines wiederum etwas unpraktischer, da ich versuche bei größeren programmen möglichst viel auf einzelne funktionen auszulagern, um alles etwas übersichtlicher zu halten ^^
    das ziehe ich auch bei solch kleinen sachen durch ;)

    im endeffekt wird alles übersichtlicher mit guionevent, aber dort scheint es kein äquivalent zu guigetmsg zu geben.