Buttons und Schleifen

  • Mhh hab mal die SuFu benutzt und die Help is auch gelesen.
    Ich habe ein sicherlich bekanntes Problem und zwar :

    Wenn ich zb eine Do schleife habe :

    Code
    if winactive ("Test") = 0 then
    do 
    winactive ("Test") until
    winactive ("Test") = 1

    So, während autoit diese schleife ausführt kann man keinen anderen button betätigen, geschweige denn das prog beenden.
    Kann man das irgendwie verändern, umgehen ?

    thx

    • Offizieller Beitrag

    Schau dir mal AdlibEnable an damit könntest du eine Func in gewissen Zeitabständen aufrufen die dann den Abbruch abfragt .

  • oO da steig ich jetzt nich so ganz durch.. werd mich aber mal damit beschäftigen.. kannste mir nen bsp code geben ?

    • Offizieller Beitrag

    Hab dir mal ein Beispiel geschrieben .

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    $Counter = 0
    $Abbruch = False
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form1", 413, 298, 303, 219)
    $Button1 = GUICtrlCreateButton("Starten ", 40, 32, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Stoppen ", 40, 72, 75, 25, 0)
    $Label1 = GUICtrlCreateLabel("", 224, 32, 140, 25)
    $Label2 = GUICtrlCreateLabel("", 224, 52, 140, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $Counter = 0
    GUICtrlSetData($Label2, "Schleife läuft")
    AdlibEnable("Test", 100)
    Start()
    EndSwitch
    WEnd
    Func Start()
    Do
    GUICtrlSetData($Label1, $Counter)
    $Counter = $Counter + 1
    Sleep(2000)
    Until $Counter = 100 Or $Abbruch
    GUICtrlSetData($Label2, "Schleife beendet")
    AdlibDisable()
    $Abbruch = False
    EndFunc ;==>Start

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

    Func Test()
    If GUIGetMsg() = $Button2 Then $Abbruch = True
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
    EndFunc ;==>Test

    [/autoit]

    Der einzige Schöbheitsfehler ist das beim Sleep(2000) in der Schleife der Abbrechen Button erst nach dem Sleep ausgewertet wird .

    Hab noch ein Beispiel mit Verwendung von _Timer_SetTimer anstatt AdlibEnable

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Timers.au3>
    $Counter = 0
    $Abbruch = False
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form1", 413, 298, 303, 219)
    $Button1 = GUICtrlCreateButton("Starten ", 40, 32, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Stoppen ", 40, 72, 75, 25, 0)
    $Label1 = GUICtrlCreateLabel("", 224, 32, 140, 25)
    $Label2 = GUICtrlCreateLabel("", 224, 52, 140, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $Counter = 0
    GUICtrlSetData($Label2, "Schleife läuft")
    _Timer_SetTimer($Form2, 100, "Test")
    Start()
    EndSwitch
    WEnd
    Func Start()
    Do
    GUICtrlSetData($Label1, $Counter)
    $Counter = $Counter + 1
    Sleep(2000)
    Until $Counter = 100 Or $Abbruch
    GUICtrlSetData($Label2, "Schleife beendet")
    _Timer_KillAllTimers($Form2)
    $Abbruch = False
    EndFunc ;==>Start

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

    Func Test($hWnd, $Msg, $iIDTimer, $dwTime)
    Switch GUIGetMsg()
    Case $Button2
    $Abbruch = True
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    EndFunc ;==>Test

    [/autoit]