Klick auf Button abfragen trotz While-Schleife...

  • Hallo zusammen,

    tja, wie fange ich an? Kompliziertes Problem...

    Ich bastel an einer GUI die zum Sichern von lokalen Verzeichnissen nacheinander verschiedene Kopierprozesse startet, und zwar per Robocopy.exe. Die Log-Ausgabe des Prozesses mache ich mit StdOutRead() in einem Edit-Control sichtbar.

    Spoiler anzeigen
    [autoit]

    $hPID = Run($backupshare & '\_backupscript\robocopy.exe "' & @mydocumentsdir & '" "' & $backupdestination & '\MyDocuments" /mir /R:0 /W:0',"","",6)
    While ProcessExists($hPID)
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Wend

    [/autoit]


    So weit, so gut.
    Nun möchte ich aber folgendes realisieren: Es gibt ein MainGUI mit dem Button der die Robocopy-Prozesse nacheinander startet. Das Edit-Feld für den Log-Output habe ich aber in einem anderen GUI-Fenster. Das MainGUI wird deaktiviert und das zweite GUI wird mit @SW_SHOW geöffnet. Der Prozess läuft und im Log läuft die Ausgaben. Das klappt schonmal :rolleyes: . In dem zweiten GUI habe ich nun ein Button, welcher den laufenden Prozess abbricht um zum nächsten springt.
    Das Problem: Innerhalb der Schleife für den Output reagiert das Script aber nicht auf den klick auf den 'Cancel'-Button...
    Das GUI läuft übrigens im 'OnEventMode' weil ich dachte, dass es so gehen würde. Im 'MessageLoopMode' klappt es auch nicht...

    Verstanden? Ideen?

  • Servous , wie wäre es mit sowas?

    Spoiler anzeigen
    [autoit]


    $hPID = Run($backupshare & '\_backupscript\robocopy.exe "' & @mydocumentsdir & '" "' & $backupdestination & '\MyDocuments" /mir /R:0 /W:0',"","",6)
    While ProcessExists($hPID)
    If $Cancel = False Then
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Else
    GUICtrlSetData($e_logoutput, @CRLF & 'Task Skipped')
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    ExitLoop ; exit aus der While Schleife
    EndIf
    Wend

    [/autoit]

    jetzt müsstest du beim drücken des Cancel Buttons nur noch die Variable $Cancel auf True setzen und die Schleife wird abgebrochen , beim starten des nächsten Vorgangs muss diese natürlich dann wieder auf $Cancel = False gesetzt werden

    Gruß Marvin

  • Danke für eine schnelle Antwort. Aber das Problem ist, dass der klick auf den Button überhaupt nicht registriert wird.

    Ich habe mir aber auch schon selber geholfen. Allerdings ist das bestimmt nicht die schönste Variante...

    Beim öffnen des LogGUI setze ich 'GUIOnEventMode' wieder auf NULL, also auf den MessageMode. Im laufe der WHILE-Schleife für den Log-Output frage ich dann gleichzeitig $msg ab. Klickt man nun auf den Button, wird der Prozess gestoppt und der 'GUIOnEventMode' wird wieder auf EINS gesetzt. usw usw....

    [autoit]


    AutoItSetOption ( "GUIOnEventMode", 0)
    Func RefreshLog()
    While ProcessExists($hPID)
    $msg = GUIGetMsg()
    If $msg = $lv_Stoptask Then StopTask()
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Wend
    EndFunc

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

    Func StopTask()
    LogWrite("stop " & $hPID)
    ProcessClose ( $hPID)
    ProcessWaitClose ( $hPID)
    AutoItSetOption ( "GUIOnEventMode", 1)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Danke für eine schnelle Antwort. Aber das Problem ist, dass der klick auf den Button überhaupt nicht registriert wird.

    Ich habe mir aber auch schon selber geholfen. Allerdings ist das bestimmt nicht die schönste Variante...

    Beim öffnen des LogGUI setze ich 'GUIOnEventMode' wieder auf NULL, also auf den MessageMode. Im laufe der WHILE-Schleife für den Log-Output frage ich dann gleichzeitig $msg ab. Klickt man nun auf den Button, wird der Prozess gestoppt und der 'GUIOnEventMode' wird wieder auf EINS gesetzt. usw usw....

    und wenn du es mal so versuchst?

    [autoit]


    AutoItSetOption ( "GUIOnEventMode", 0)
    Func RefreshLog()
    While ProcessExists($hPID)
    $msg = GUIGetMsg()
    Select
    Case $msg = $lv_Stoptask
    StopTask()
    endselect
    $readData = StdoutRead($hPID, 1)
    If $readData <> $oldData Then
    GUICtrlSetData($e_logoutput, @CRLF & $readData)
    _GUICtrlEdit_LineScroll($e_logoutput, 0, _GUICtrlEdit_GetLineCount($e_logoutput))
    $oldData = $readData
    EndIf
    Wend
    EndFunc

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

    Func StopTask()
    LogWrite("stop " & $hPID)
    ProcessClose ( $hPID)
    ProcessWaitClose ( $hPID)
    AutoItSetOption ( "GUIOnEventMode", 1)
    EndFunc

    [/autoit]
  • hast du auch mal überprüft ob du deinen Cancel butten richtig euf den event setzt?

    weil wenn er nicht in die funktion springt(im falle cancel) dann stimmt was an dem setzten deines Cancel Buttons nicht.

  • Unglaublich... Und bitte jetzt nicht hauen... :wacko:

    Da ist es mir doch glatt gelungen die Breite eines Label-Control mit 500 statt mit 50 anzugeben. Somit wurde der Button vom Label überlagert und ließ sich dadurch nicht klicken... X(

    Danke, Death, das war ein hilfreicher Hinweis. :D