Script pausieren

  • Also hab da ein problem:

    ich nöchte, dass wenn ich auf den bei mir "Stop" button drück das script gestoppt wird. wie mach ich das? kann mir wer den code hinschreiben? THX im vorraus

  • Ich nehme mal an du meinst den Buttom einer selbst erstellten GUI oder?

    AutoIt Script
    [autoit]


    $hGUI = GUICreate("GUI",350,50,-1,-1)
    $hStopButton = GUICtrlCreateButton("Stop",50,15,100,21)
    $hWeiterButton = GUICtrlCreateButton("Weiter",200,15,100,21)
    GUISetState(1,$hGUI)
    While 1
    sleep(25)
    $msg = GUIGetMsg()
    If $msg = -3 Then exit
    If $msg = $hStopButton Then
    While $msg <> $hWeiterButton
    sleep(25)
    $msg = GUIGetMsg()
    If $msg = -3 Then exit
    WEnd
    EndIf
    ToolTip("Folgt deiner Maus.")
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von Zeitriss (23. Juni 2010 um 15:27)

  • Hier eine Lösung für einen Pause Knopf, die IMMER funktioniert.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>

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

    $hGUI = GUICreate("")
    $cButtonGo = GUICtrlCreateButton("Iwas starten", 20, 20, 200, 20)
    $MeinExitButton = GUICtrlCreateButton("Pause", 20, 50, 200, 20)

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

    Global $bPaused = False ; <- Das brauchst du
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; <- Das brauchst du

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

    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $cButtonGo
    Funktion()
    EndSwitch
    WEnd

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

    Func Funktion()
    Local $x = 10, $t = TimerInit()
    ConsoleWrite("start" & @CRLF)
    For $i = 1 To 100000000
    $x += $i
    $x = Mod($x, $i)
    If TimerDiff($t) > 100 Then
    ConsoleWrite($i & @TAB & $x & @CRLF)
    $t = TimerInit()
    EndIf
    Next
    ConsoleWrite("ende" & @CRLF)
    EndFunc ;==>Funktion

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

    ;~ =======================================
    ;~ Diese beiden funktionen brauchst du:
    Func WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
    Local $hButton = $MeinExitButton ; <- Anpassen!

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

    $hButton = GUICtrlGetHandle($hButton)
    If $lParam = $hButton Then
    $bPaused = Not $bPaused
    AdlibRegister("WM_COMMAND_ADLIB", 10)
    EndIf
    EndFunc ;==>WM_COMMAND

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

    Func WM_COMMAND_ADLIB()
    AdlibUnRegister("WM_COMMAND_ADLIB")
    While $bPaused And Sleep(10)
    WEnd
    EndFunc ;==>WM_COMMAND_ADLIB
    ;~ =======================================

    [/autoit]
  • Zeitriss

    ja

    aba iwie geht des imma noch nicht why au imma

    dann poste doch dein bisheriges Skript, damit man sehen kann wie du das Beispiel von Zeitriss umgesetzt hast :!:

    @xEr0r:

    Was funzt den an meinem Script nicht?

    Man kann es während das Skript gestoppt ist nicht beenden

    @sebuo warum so umständlich :?: So funktionierts doch auch:

    Spoiler anzeigen
    [autoit]

    $hGUI = GUICreate("GUI",350,50,-1,-1)
    $hWeiterButton = GUICtrlCreateButton("Start",50,15,100,21)
    $hStopButton = GUICtrlCreateButton("Stop",200,15,100,21)
    GUISetState(1,$hGUI)
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    case -3
    exit
    case $hStopButton
    AdlibUnRegister("DoIt")
    GUICtrlSetData($hWeiterButton,"Weiter")
    case $hWeiterButton
    AdlibRegister("DoIt",10) ;Zeit anpassen
    EndSwitch
    WEnd

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

    Func DoIt()
    ToolTip("Folgt deiner Maus.")
    EndFunc

    [/autoit]

    mfg (Auto)Bert

  • o warum so umständlich :?: So funktionierts doch auch:


    Weil per GUIRegisterMsg die Möglichkeit gegeben ist das Script zu jeder Zeit und aus jeder Schleife heraus zu pausieren. Ganz anders als bei GUIGetMsg().
    OnEvent geht zwar in die richtige Richtung, kann aber Aktionen auch nur ausführen, wenn sich das Script in der Hauptschleife befindet. Hängt das Script in einer Schleife innerhalb einer Funktion, dann hilft auch der OnEvent mode nicht wieter.

    Deswegen :

    Zitat

    Hier eine Lösung für einen Pause Knopf, die IMMER funktioniert.

    //EDIT: Ich weiß übrigens auch, dass man bei richtiger benutzung von OnEvent alles in eine Hauptschleife auslagern kann. Nur mal der Vollständigkeit halber.

  • SEuBo,

    Deswegen :

    Zitat
    Hier eine Lösung für einen Pause Knopf, die IMMER funktioniert.

    stimmt die Funktion wird sofort pausiert und danach (beim erneten Klick auf Pause) korrekt an der richtigen Stelle fortgeführt , aber selbst im Pause-Zustand kann man das Skript nicht beenden. Ich habe mein Skript auf OnEvent-Mode umgeschrieben. Die eigentliche Funktion wird jetzt in 1000er Blöcken abgearbeitet (lässt sich auch verkleinern nur zur DEMO). Das Skript lässt sich zu jeder Zeit beenden, auch Nachrichten von andere Controls werden sofort abgearbeitet (siehe Button, der eine 2. Gui anzeigt) allerdings wird ein Durchlauf der Schleife immer komplett abgearbeitet, aber wie gesagt man kann die Blöcke ja verkleinern, oder auf eine andere Schleife (in der man den Zähler selbst hochzählt) umstellen.

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Add_Constants=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; *** Start added by AutoIt3Wrapper ***
    #include <GUIConstantsEx.au3>
    ; *** End added by AutoIt3Wrapper ***
    Opt('GUIOnEventMode', 1)

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

    Global $hGUI2 = -99, $iStart = 1

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

    $hGUI = GUICreate("GUI", 350, 70, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    $hWeiterButton = GUICtrlCreateButton("Start", 50, 15, 100, 21)
    GUICtrlSetOnEvent(-1, "Start")
    $hStopButton = GUICtrlCreateButton("Stop", 200, 15, 100, 21)
    GUICtrlSetOnEvent(-1, "Stop")
    $msgButton = GUICtrlCreateButton("2. Gui", 20, 50, 200, 20)
    GUICtrlSetOnEvent(-1, "Gui2")
    GUISetState(@SW_SHOW, $hGUI)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func Start()
    AdlibRegister("DoIt", 10) ;Zeit anpassen
    GUICtrlSetState($hStopButton, $Gui_Enable)
    GUICtrlSetState($hWeiterButton, $Gui_Disable)
    EndFunc ;==>Start

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

    Func Stop()
    AdlibUnRegister("DoIt")
    GUICtrlSetData($hWeiterButton, "Weiter")
    GUICtrlSetState($hStopButton, $Gui_Disable)
    GUICtrlSetState($hWeiterButton, $Gui_Enable)
    EndFunc ;==>Stop

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

    Func Gui2()
    If $hGUI2 = -99 Then
    $hGUI2 = GUICreate("2. GUI", 350, 70, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "back")
    EndIf
    GUICtrlCreateButton("&zurück", 20, 50, 200, 20)
    GUICtrlSetOnEvent(-1, "back")
    GUISetState(@SW_SHOW, $hGUI2)
    EndFunc ;==>Gui2

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

    Func back()
    GUISetState(@SW_HIDE)
    EndFunc ;==>back

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

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

    Func DoIt()
    if $iStart >= 100000000 Then return
    Local $x = 10, $t = TimerInit()
    For $i = $iStart To $iStart + 999
    $x += $i
    $x = Mod($x, $i)
    WinSetTitle($hGUI, "", "Gui " & $i & " " & $x)
    ;ConsoleWrite($i & " " & $x &@CRLF)
    Sleep(10)
    Next
    $iStart = $i
    EndFunc ;==>DoIt

    [/autoit]

    Da ich es nicht für Maus schubsen und irgendwelche Tasten klicken benutzen will, halte ich dies für die bessere Lösung, da trotz kontinuierlicher Berechnun(en) alle Botschaften ankommen und abgearbeitet werden,

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (23. Juni 2010 um 20:09)