Schleifenabbruchmöglichkeit durch Button

  • Hallo zusammen,

    habe mich soeben frisch im Forum angemeldet. Bin absoluter autoit Neuling.

    Ich bin dabei mir eine GUI zu erstellen um mit robocopy (direkt oder per batch Aufruf) Dateien auf mein NAS zu sichern. Zu Testzwecken rufe ich aktuell nur einen "ping" auf localhost auf.


    In der Funktion mit der ich die cmd Ausgabe in die GUI weiterleite, habe ich folgendes Problem.

    Ich schaffe es nur, entweder ohne Abbruchmöglichkeit oder wenn dann mit zwanghafter Abbruchmöglichkeit (Button). Da sich die schleife nun nicht mehr beendet..

    Gewünscht ist aber nur die Möglichkeit Abbrechen zu können.

    [autoit]


    #include <constants.au3>
    #include <windowsconstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    $win=GUICreate("Script zur Sicherung durch robocopy - ver0.1", 640,480,-1,-1)
    GUICtrlCreateLabel ("Live Ansincht", 10, 10, 710)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $btn_copy=GUICtrlCreateButton("copy",220,440,75,25)
    $btn_exit=GUICtrlCreateButton("Exit",400,440,75,25)

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

    $output_cmd = GUICtrlCreateEdit("", 10, 40, 620, 300, $ES_READONLY + $WS_VSCROLL + $WS_HSCROLL)

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

    GUISetState()

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

    $exit=False
    While $exit=False
    $nMsg = GUIGetMsg()
    Switch $nMsg
    case $btn_exit
    $exit=True
    case $btn_copy
    _write_console()
    EndSwitch
    wend
    GUIDelete()

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

    func _write_console()
    $btn_cancel=GUICtrlCreateButton("Abbruch",310,440,75,25)
    Local $robocopy = Run(@ComSpec & " /c " & "ping 127.0.0.1", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line

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

    ConsoleWrite($line)

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

    While 1
    $line=StdoutRead($robocopy)
    $nMsg=GUIGetMsg() ; <------------------------------------- Abbruchmöglichkeit

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

    Select
    Case @error
    ExitLoop
    Sleep(10)

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

    case $line <> ""
    GUICtrlSetData($output_cmd, $line,1)

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

    Case $nMsg=$btn_cancel ; <------------------------------------- Abbruchmöglichkeit
    MsgBox(0, "blabla", "Abbruch") ; <------------------------------------- Abbruchmöglichkeit
    ExitLoop ; <------------------------------------- Abbruchmöglichkeit

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

    EndSelect

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

    WEnd

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

    MsgBox(0, "blabla", "Funktion abgeschlossen")
    EndFunc

    [/autoit]


    Vermutlich check ichs einfach nicht... dürft ihr ruhig sagen ;)

    Für Tipps oder Lösungen wäre ich sehr dankbar.

    Greetz

  • Hallo BugFix,

    vielen Dank für die schnelle Antwort. Wird nicht mehr vorkommen :D

    Leider geht mir aus dem Gui-Konzept Hilfedingen nicht hervor wie ich innerhalb einer Funktion ansonsten per Button Abbrechen kann..

    Oder sollte ich generell einen anderen Aufbau wählen?

  • Den Button gleich mit Starten des Scriptes erstellen und wenn gewünscht auf enabled/disabled oder show/hide stellen.
    Endlosschleifen sollten nicht in eine Funktion.

    Generell wäre hier der OnEvent Modus im Vorteil. Da dort immer auf die GUI-Events reagiert wird

    • Offizieller Beitrag

    Schnitzel: Das stimmt so nicht! Wenn Du im OnEventMode per Button eine Funktion aufrufst, in der Du eine Endlos-Schleife laufen lässt, dann reagiert die GUI nicht auf weitere Events.

    Es ist aber generell nicht nötig in der aufgerufenen Funktion diese Schleife laufen zu lassen. Man kann den Prozess mit Run starten und dann in der eigentlichen Schleife darauf reagieren:

    Spoiler anzeigen
    [autoit]


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

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

    $win = GUICreate("Script zur Sicherung durch robocopy - ver0.1", 640, 480, -1, -1)
    GUICtrlCreateLabel("Live Ansincht", 10, 10, 710)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $btn_copy = GUICtrlCreateButton("copy", 220, 440, 75, 25)
    $btn_exit = GUICtrlCreateButton("Exit", 400, 440, 75, 25)

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

    $output_cmd = GUICtrlCreateEdit("", 10, 40, 620, 300, $ES_READONLY + $WS_VSCROLL + $WS_HSCROLL)
    $btn_cancel = GUICtrlCreateButton("Abbruch", 310, 440, 75, 25)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUISetState()

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

    Global $robocopy

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $btn_exit, $GUI_EVENT_CLOSE
    Exit
    Case $btn_copy
    GUICtrlSetState($btn_copy, $GUI_DISABLE)
    GUICtrlSetState($btn_cancel, $GUI_SHOW)
    $robocopy = Run(@ComSpec & " /c " & "ping 127.0.0.1", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Case $btn_cancel
    GUICtrlSetState($btn_cancel, $GUI_HIDE)
    GUICtrlSetState($btn_copy, $GUI_ENABLE)
    ProcessClose($robocopy)
    EndSwitch
    If ProcessExists($robocopy) Then
    $line = StdoutRead($robocopy)
    GUICtrlSetData($output_cmd, $line, 1)
    Else
    If BitAND(GUICtrlGetState($btn_cancel), $GUI_SHOW) Then GUICtrlSetState($btn_cancel, $GUI_HIDE)
    If BitAND(GUICtrlGetState($btn_copy), $GUI_DISABLE) Then GUICtrlSetState($btn_copy, $GUI_ENABLE)
    EndIf
    WEnd

    [/autoit]
  • Schnitzel: Das stimmt so nicht! Wenn Du im OnEventMode per Button eine Funktion aufrufst, in der Du eine Endlos-Schleife laufen lässt, dann reagiert die GUI nicht auf weitere Events.


    Ja ok. War nicht ganz richtig geschrieben.
    Ich hätte die Run Funktion mit Stdout Auswertung auch auserhalb in die Endlosschleife gepackt und nicht innerhalb einer Funktion.
    Natürlich geht es auch im GuiGetMsg wenn man die Endlosschleife für mehrere Dinge verwendet aber der OnEvent gefällt mir da persönlich besser.