Abbruchbedingung in For Schleife

  • Ich brauch mal kurz einen Tipp, bzw. ein Beispielcode

    Wenn ich eine For Schleife am laufen habe, z.B. von 1 bis 100, und zwischendrin von Hand die Funktion unterbrochen werden muss, wie mache ich das ? Die Abbruchfunktion in der While 1 ... Wend Schleife kann zu diesem Zeitpunkt ja nicht greifen.

    Gruss und Danke
    Hassan

  • ich weiß grad net genau, was du willst !?
    meinst du sowas ?

    Spoiler anzeigen
    [autoit]

    Global $iCount
    For $iCount = 1 To 100
    ; mache irgendwas
    ConsoleWrite($iCount & @CRLF)
    if $iCount=50 Then ExitLoop
    Next

    [/autoit]
  • Hier hast du 2 Möglichkeiten:

    [autoit]

    ConsoleWrite(@CRLF)

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

    For $i = 1 To 10
    If $i = 5 Then ExitLoop
    ConsoleWrite($i & @CRLF)
    Next

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

    ConsoleWrite(@CRLF)

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

    For $i = 1 To 10
    If $i = 5 Then $i = 10
    ConsoleWrite($i & @CRLF)
    Next

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

    ConsoleWrite(@CRLF)

    [/autoit]
  • OK, hier nochmals etwas genauer.

    Ich brauche einen "Panik Abbruch"

    Hier mal meine While Schleife

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Start
    _Start()
    Case $Stop
    _Stop()
    Exit
    EndSwitch
    WEnd

    [/autoit]


    d.h. wenn ich auf X drücke, oder mein _Stop Function auswähle, beendet sich die Anwendung.

    In der For Schleife soll bei jedem Durchlauf auch so ein "Case Event" abgefragt werden und dann der Exitloop.

    und hier hänge ich

  • so in etwa :

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode",1)
    Global $iCount
    Global $bAbbruch = False
    Global $hGUI = GUICreate("For-Schleife")
    GUISetOnEvent(-3,"_abbruch") ; -3 entspricht $GUI_EVENT_CLOSE
    GUISetState()
    For $iCount = 1 To 100
    if $bAbbruch Then ExitLoop
    ; mache irgendwas
    ConsoleWrite($iCount & @CRLF)
    Sleep(100)
    Next

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

    Func _abbruch ()
    MsgBox(0,"","Panik-Abbruch durchgeführt")
    $bAbbruch=True
    EndFunc

    [/autoit]
  • So in etwa?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('GUICloseOnESC', 0)

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

    Global $hGUI, $idButtonOne, $idButtonTwo, $iEvent

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('Example', 120, 70)
    $idButtonOne = GUICtrlCreateButton('Start', 10, 10, 100, 20)
    $idButtonTwo = GUICtrlCreateButton('Stop', 10, 40, 100, 20)
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While Sleep(10)
    _Event()
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Event($iFlag = 1)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUI_EVENT_CLOSE()
    Case $idButtonOne
    _Start()
    Case $idButtonTwo
    _Stop($iFlag)
    EndSwitch
    EndFunc

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

    Func GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Func _Start()
    Local Static $bRun
    $bRun = Not $bRun
    For $iCount = 1 To 10000
    _Event(2)
    If Not $bRun Then ExitLoop(1)
    ConsoleWrite($iCount & @CRLF)
    Next
    EndFunc

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

    Func _Stop($iFlag)
    If $iFlag = 2 Then _Start()
    ConsoleWrite('! ENDE' & @CRLF)
    EndFunc

    [/autoit]


    Ich persönlich würde ja den GUIOnEventMode verwenden...

    ... Ich denke mal wieder viel zu umständlich ^^

  • so wird das aber viel ungenauer...

    Spoiler anzeigen
    [autoit]

    Global $iCount
    Global $hGUI = GUICreate("For-Schleife")
    GUISetState()
    For $iCount = 1 To 100
    if GUIGetMsg()=-3 Then ; -3 entspricht $GUI_EVENT_CLOSE
    MsgBox(0,"","Panik-Abbruch durchgeführt")
    ExitLoop
    EndIf
    ; mache irgendwas
    ConsoleWrite($iCount & @CRLF)
    Sleep(100)
    Next

    [/autoit]
  • Mit Timer arbeiten :D

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('GUICloseOnESC', 0)

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

    Global $hGUI, $idButtonOne, $idButtonTwo, $bRun

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

    ConsoleWrite(@CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('Example', 120, 70)
    $idButtonOne = GUICtrlCreateButton('Start', 10, 10, 100, 20)
    $idButtonTwo = GUICtrlCreateButton('Stop', 10, 40, 100, 20)
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While Sleep(10)
    _Event()
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Event($iFlag = 1)
    Switch GUIGetMsg()
    Case $idButtonOne
    If $iFlag = 1 Then _Start()
    If $iFlag = 2 Then _Stop()
    Case $idButtonTwo
    If $iFlag = 2 Then _Stop()
    Case $GUI_EVENT_CLOSE
    GUI_EVENT_CLOSE()
    EndSwitch
    EndFunc

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

    Func _Start()
    Local $iCount, $hTime
    $bRun = True

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

    ConsoleWrite('+ START' & @CRLF)

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

    $hTime = TimerInit()
    For $iCount = 1 To 20
    _Event(2)
    If Not $bRun Then ExitLoop

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

    If TimerDiff($hTime) >= 250 Then
    ConsoleWrite('> ' & $iCount & @CRLF)
    $hTime = TimerInit()
    Else
    $iCount -= 1
    EndIf

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

    If $iCount = 20 Then GUI_EVENT_CLOSE()
    Next
    EndFunc

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

    Func _Stop()
    $bRun = False
    ConsoleWrite('! STOP' & @CRLF & @CRLF)
    EndFunc

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

    Func GUI_EVENT_CLOSE()
    ConsoleWrite(@CRLF)
    Exit
    EndFunc

    [/autoit]
  • Ich verwende aber den MessageLoop Modus, wie kann ich dass dann bauen ?


    hier ein Beispiel:

    Spoiler anzeigen
    [autoit]

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

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

    $gui = GUICreate("KLeines 1 X 1", 400, 120)
    $Start = GUICtrlCreateButton("&Start", 10, 10)
    $PauseResume = GUICtrlCreateButton("&Pause", 10, 40)
    $Anzeige = GUICtrlCreateLabel("Anzeige", 10, 90, 380)
    GUISetState()

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

    While 1
    _EventHandler()
    WEnd

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

    Func _EventHandler()
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Start
    GUICtrlSetState($Start, $GUI_DISABLE)
    For $i = 1 To 10
    For $j = 1 To 10
    GUICtrlSetData($Anzeige, $j & " * " & $i & " = " & $i * $j)
    _MySleep(500)
    Next
    Next
    GUICtrlSetState($Start, $GUI_ENABLE)
    Case $PauseResume
    If GUICtrlRead($PauseResume) = "&Pause" Then
    GUICtrlSetData($PauseResume, "&Weiter")
    While GUICtrlRead($PauseResume) <> "&Pause"
    _MySleep(50)
    WEnd
    Else
    GUICtrlSetData($PauseResume, "&Pause")
    EndIf
    EndSwitch
    EndFunc ;==>_EventHandler

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

    Func _MySleep($iMSec)
    Local $iStart = TimerInit()
    Do
    _EventHandler()
    Until TimerDiff($iStart) >= $iMSec
    EndFunc ;==>_MySleep

    [/autoit]

    mfg autoBert

    • Offizieller Beitrag

    Ich würde statt eine Schleife zu starten, einfach eine Variable als Zähler verwenden und diese in die MessageLoop-Schleife einbauen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    $hGui = GUICreate('Test', 300, 200)
    $ID_Label = GUICtrlCreateLabel('0', 10, 10, 200, 20)
    $ID_Start = GUICtrlCreateButton('Start', 10, 40, 80, 20)
    $ID_Stop = GUICtrlCreateButton('Stop', 100, 40, 80, 20)
    GUISetState()
    Global $fStart = False, $iCounter = 0
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ID_Start
    $fStart = True
    Case $ID_Stop
    $fStart = False
    EndSwitch
    If $fStart Then
    $iCounter += 1
    If $iCounter = 10000 Then $fStart = False
    GUICtrlSetData($ID_Label, $iCounter)
    EndIf
    WEnd

    [/autoit]


    Das ist viel einfacher und weniger fehleranfällig, als diese "Spaghetticode-Rekursiv-Aufrufe" irgendwelcher Funktionen.

    Generell solltest Du Dir aber darüber im Klaren sein, dass die MsgLoop-Schleife abhängig ist vom Benutzer. Wenn der Benutzer die Maus bewegt oder etwas auf der Tastatur schreibt, wird die Schleife öfter durchlaufen, als wenn der Benutzer gerade nichts macht. Wenn das entscheidend ist, dann solltest Du auf den OnEventMode ausweichen.