schleife abbrechen (do...until)

  • hi,
    das skript funktioniert zwar aber auf eine etwas unerklärlich art und weise.
    man muss den stop button mehrmals drücken damit die schleife abgebrochen wird. leider kann ich mir gerade nciht erklären weshalb dies auftritt.

    [autoit]


    #include <ButtonConstants.au3>
    #Include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt ("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 105, 78, 401, 258)
    $Start = GUICtrlCreateButton("start", 16, 8, 73, 25, 0)
    $Stop = GUICtrlCreateButton("stop", 16, 40, 73, 25, 0)
    GUICtrlSetOnEvent ($Start, "loop")
    GUICtrlSetOnEvent ($Stop, "stop")
    GUISetState()

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

    While 1
    sleep(100)
    WEnd

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

    Func loop()
    $timer = TimerInit()
    $i = 0
    Do
    if TimerDiff($timer)>3000 Then
    $st = GUIGetCursorInfo()
    $st2 = _IsPressed("01")
    if $st[4] = $Stop And $st2 = "1" Then
    Exit
    Else
    $timer = TimerInit()
    $i = $i + 1
    MsgBox(0, "counter", $i)
    EndIf
    EndIf
    Until $i = 3

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

    EndFunc

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

    Func stop()
    Exit
    EndFunc

    [/autoit]

    mfg bocky

    Einmal editiert, zuletzt von bocky3 (19. Mai 2009 um 11:49)

  • funktion stop ist lediglich unglücklich betitelt bzw hab das nie geändert.

    der abbruch der schleife erfolgt hier:

    [autoit]


    if $st[4] = $Stop And $st2 = "1" Then
    Exit
    ...
    EndIf

    [/autoit]
  • Hallo bocky,

    Zitat

    hi,
    das skript funktioniert zwar aber auf eine etwas unerklärlich art und weise.
    man muss den stop button mehrmals drücken damit die schleife abgebrochen wird. leider kann ich mir gerade nciht erklären weshalb dies auftritt.


    Also wenn ich 1 x stop drücke und $i noch nicht 3 ist muss ich warten bis $i 3 danach wird die func stop aufgerufen und das Programm beendet. Beschreib doch mal was du genau erreichen willst, dann findet sich auch eine Lösung

    z.B.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #Include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt ("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 105, 78, 401, 258)
    $Start = GUICtrlCreateButton("start", 16, 8, 73, 25, 0)
    $Stop = GUICtrlCreateButton("stop", 16, 40, 73, 25, 0)
    GUICtrlSetOnEvent ($Start, "loop")
    GUICtrlSetOnEvent ($Stop, "stop")
    GUISetState()

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

    While 1
    sleep(100)
    WEnd

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

    Func loop()
    $timer = TimerInit()
    $i = 0
    Do
    if TimerDiff($timer)>3000 Then
    $st = GUIGetCursorInfo()
    $st2 = _IsPressed("01")
    if $st[4] = $Stop Then ; And $st2 = "1" Then
    Exit
    Else
    $timer = TimerInit()
    $i = $i + 1
    MsgBox(0, "counter", $i)
    EndIf
    EndIf
    Sleep(125)
    Until $i = 3

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

    EndFunc

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

    Func stop()
    Exit
    EndFunc

    [/autoit]

    Ich weiss aber nicht was du bezwecken willst


    mfg (Auto)Bert

  • die schleife soll angehalten werden, wenn der stop button einmal gedrückt wird.
    dazu muss ich in der schleife selbst abfragen ob der button gedrückt wird. das wird einerseits über die position und andererseits über den status der rechten maustaste geprüft.

    man könnte das exit auch zu einem exitloop wandeln.

    [autoit]


    if $st[4] = $Stop And $st2 = "1" Then
    ExitLoop
    ...
    EndIf

    [/autoit]

    das programm beendet zur zeit zwar die schleife nach mehrmaligen drücken des buttons, aber das ist nicht sinn und zweck der sache.
    ziel ist es die schleife mit einem knopfdruck anzuhalten/abzubrechen, auch wenn der wert für $i noch nciht erreicht ist.

    mfg bocky

    • Offizieller Beitrag

    Hallo,

    du must die Prüfung in der Loop-Funktion nur an der richtigen Stelle machen dann gehts auch direkt. Du prüfst ja nur alle 3 sek. ob der Stop-Button angeklickt wurde.


    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 105, 78, 401, 258)
    $Start = GUICtrlCreateButton("start", 16, 8, 73, 25, 0)
    $Stop = GUICtrlCreateButton("stop", 16, 40, 73, 25, 0)
    GUICtrlSetOnEvent($Start, "loop")
    GUICtrlSetOnEvent($Stop, "stop")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func loop()
    $timer = TimerInit()
    $i = 0
    Do
    $st = GUIGetCursorInfo()
    if $st[4] = $Stop And $st[2] = "1" Then
    ExitLoop
    EndIf

    If TimerDiff($timer) > 3000 Then
    $timer = TimerInit()
    $i = $i + 1
    MsgBox(0, "counter", $i)
    EndIf
    Until $i = 3
    Sleep(100)
    EndFunc ;==>loop

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

    Func stop()
    Exit
    EndFunc ;==>stop

    [/autoit]