For Schlaufe auf Knopfdruck abbrechen.

  • Ich habe schon verschiedenes probiert, aber ich schaffe es nicht aus einer For Schleife auf Knopfdruck (GUI) rauszuspringen.
    Mit einer Checkbox ist es ganz einfach, aber sieht halt komisch aus.

    Das problem ist das in dieser For Schleife ein FTP Befehl steckt der wenn der zielrechner nicht verfügbar ist, es etwa 20 sekunden "stehen" bleibt.
    Und ich so nicht auf den Knopf auf der GUI reagieren kann.

    Um euch nicht mit meinem ganzen Code vollzuballern, habe ich es hier vereinfacht.

    Hat jemand ne Idee wie ich den gedrückten Stop Knopf erkennen kann?
    Ist es irgendwie möglich so zu machen das er gedrückt bleibt?? Und ich Ihn dann einfach wie die Checkbox nach dem Status abfragen kann.
    Den timeout vom FTP kann ich vermutlich nicht umgehen, aber das es wenigstens möglich währe nach dem timeout die For Schlaube abzubrechen währe schon cool.


    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 171, 65, -1, -1)
    $bStart = GUICtrlCreateButton("Start", 7, 8, 75, 25, 0)
    $bStop = GUICtrlCreateButton("Stop", 87, 8, 75, 25, 0)
    $xStop = GUICtrlCreateCheckbox("Stop", 96, 40, 49, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUICtrlSetState($bStop,$GUI_DISABLE)
    GUICtrlSetState($xStop,$GUI_DISABLE)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $bStart
    GUICtrlSetState($bStart,$GUI_DISABLE)
    GUICtrlSetState($bStop,$GUI_ENABLE)
    GUICtrlSetState($xStop,$GUI_ENABLE)
    For $1 = 100 To 110
    RunWait('ftp -s:test.txt 192.168.0.' & $1,'',@SW_HIDE)
    ConsoleWrite($1 & @CRLF) ;nur damit ich sehe wo es gerade steckt
    If GUICtrlRead($xStop)=$GUI_CHECKED Then ExitLoop
    Next
    GUICtrlSetState($bStart,$GUI_ENABLE)
    GUICtrlSetState($bStop,$GUI_DISABLE)
    GUICtrlSetState($xStop,$GUI_UNCHECKED+$GUI_DISABLE)
    EndSwitch
    WEnd

    [/autoit]

    Das ist der Inhalt der test.txt:

    Code
    admin
    admin
    get bild.jpg
    quit

    3 Mal editiert, zuletzt von Sayen (4. April 2009 um 15:22)

  • Mach mal aus dem ExitLoop ein Exit.
    Ich glaube damit verlässt du sie direkt.
    =)

    Bin mir aber nicht sicher ^^ Ist nur eine Vermutung

  • Du könntest es z.B. so machen:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 171, 65, -1, -1)
    $bStart = GUICtrlCreateButton("Start", 7, 8, 75, 25, 0)
    $bStop = GUICtrlCreateButton("Stop", 87, 8, 75, 25, 0)
    ;~ $xStop = GUICtrlCreateCheckbox("Stop", 96, 40, 49, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUICtrlSetState($bStop, $GUI_DISABLE)
    ;~ GUICtrlSetState($xStop, $GUI_DISABLE)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $bStart
    GUICtrlSetState($bStart, $GUI_DISABLE)
    GUICtrlSetState($bStop, $GUI_ENABLE)
    ;~ GUICtrlSetState($xStop, $GUI_ENABLE)
    For $1 = 100 To 110
    Run('ftp -s:test.txt 192.168.0.' & $1, '', @SW_HIDE)
    ConsoleWrite($1 & @CRLF) ;nur damit ich sehe wo es gerade steckt
    ;~ If GUICtrlRead($xStop) = $GUI_CHECKED Then ExitLoop
    Next
    EndSwitch
    If Not ProcessExists('ftp.exe') And BitAND(GUICtrlGetState($bStart), $GUI_DISABLE) Then
    GUICtrlSetState($bStart, $GUI_ENABLE)
    GUICtrlSetState($bStop, $GUI_DISABLE)
    ;~ GUICtrlSetState($xStop, $GUI_UNCHECKED + $GUI_DISABLE)
    EndIf
    WEnd

    [/autoit]
  • Das kann ich leider nicht machen weil ich nach jedem FTP Befehl die erhaltenen Daten zippen möchte.
    Wenn ich nicht runwait nutze habe ich im hintergrund 10 offene ftp.exe mit denen ich nichts mehr anfangen kann.

    Ich habe mir jetzt überlegt ob ich irgendwie auf eine schnelle art prüfen kann ob der FTP server erreichbar ist oder nicht.
    So eine art ping, aber auf den port 21...

    Wenn er dann nicht erreichbar währe würde ich den runwait überspringen und bei der nächsten ip weiter machen.
    telnet geht leider nicht weil es in vista nicht mehr ab werk vorhanden ist.

    Würde so ein portcheck vieleicht sogar mit autoit bordmitteln funktionieren?

    Einmal editiert, zuletzt von Sayen (4. April 2009 um 16:09)

  • Da gibts es einen Portscanner, musst das Script nur für deine Bedürfnisse anpassen:
    http://www.autoitscript.com/forum/index.php?showtopic=50236&st=0

    Wenn das FTP Programm eine Rückmeldung in die Konsole schreibt kannst du diese Fehlermeldung auslesen und daraufhin die schleife abbrechen. Stichwort: StdoutRead.

    Hatte sowas auch schon probiert, aber leider ist der timeout bei 'TCPConnect' auch 20 sekunden (wie beim FTP) wenn der rechner nichtmal erreichbar ist.
    Ist es irgendwie möglich vorübergehend diesen timeout auf z.B. 3 sec. zu setzen??

    Habe es hiermit ohne erfolg versucht: AutoItSetOption("TCPTimeout",3000) bis ich gesehen habe das der default Wert sowieso nur 100ms ist :rolleyes:
    Kann also nicht daran liegen.

    Und ich möchte ja sowieso nicht abbrechen wenn eines der Rechner nicht verfügbar ist, sondern es geht mir um den Stop Knopf den ich nicht abfangen kann ;)