Per Button schleife unterbrechen möglich?!

  • Hallo zusammen,

    ich bin am Verzweifeln.

    Ich versuche, mit einem Programm in regelmäßigen Abständen einen Text in eine Datei schreiben zu lassen, welches ich aber nach Belieben wieder abbrechen kann.

    Ich möchte auf start drücken und dann soll er so lange das durchführen, bis ich wieder stop drücke. Leider funktioniert das nicht mit den buttons, und einen Hotkey möchte ich dafür nicht verwenden.

    Hier der Code des Programmes (nicht wundern, ist nur die Grundlage, auf der das Programm aufbaut und dient zum Troubleshooting, da der code noch schön übersichtlich ist ^^). Ich hoffe, ihr versteht mein anliegen und könnt mir helfen.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 220, 94, 192, 124)
    $cmdStart = GUICtrlCreateButton("Start", 16, 48, 75, 25)
    $cmdStop = GUICtrlCreateButton("Stop", 112, 48, 75, 25)
    $txtEingabe = GUICtrlCreateInput("1", 32, 16, 121, 21)
    GUISetState(@SW_SHOW)

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

    Global $sFilePath = @ScriptDir & "\test.txt"

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

    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    Case $cmdStart
    Global $s = 0
    _Eingabe()

    Case $cmdStop
    $s = 1
    EndSwitch
    WEnd

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

    Func _Eingabe()
    While $s = 0
    FileWrite($sFilePath, "1, " & @CRLF)
    Sleep(500)
    WEnd
    EndFunc

    [/autoit]

    Vielen Dank und liebe Grüße,

    der Robert

    Einmal editiert, zuletzt von DasIch (26. März 2014 um 00:50)

  • Wenn du unter AutoIt mit parallelen Threads arbeiten könntest, würde dieser Ansatz sogar funktionieren.
    Allerdings wird $s nie auf 1 gesetzt, da aus der Schleife in der _Eingabe-Funktion nicht wieder in die Hauptschleife zur Behandlung des Buttonklicks gesprungen wird.

    Für solche Sachen ist

    [autoit]


    AdLibRegister
    AdLibUnRegister

    [/autoit]


    bestens geeignet.

    Gruß

  • oder du erledigst das schreiben in die datei direkt in der "Hauptschleife", so dass du nach jedem schreiben wieder nach neuen Events in dem GUI nachfragst.

    Es ginge auch, dass du in deiner _Eingabe()-Funktion in der Schleife immer wieder nach GUI-Events abfragst, wäre aber (meinem Gefühl nach ;) ) eher nicht so "schön"

    Als dritte Alternative könntest du auch darüber nachdenken den OnEvent-Modus zu verwenden, der deine Schleife unterbrechen würde, um auf das GUi-Event zu reagieren

    MFG inventor

    wenn's weitere Fragen gibt -> PN
    wenn da keine Antwort kommt, überdenk deine Frage noch mal

  • Hier mal nen Beispiel von mir:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    Opt("GuiOnEventMode",1)

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

    Global $sFilePath = @ScriptDir & "\test.txt"

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

    #Region ### START Koda GUI section ### Form=
    $GUI = GUICreate("GUI", 159, 220, 192, 124)
    $GO = GUICtrlCreateButton("GO", 40, 32, 81, 41)
    GUICtrlSetOnEvent($GO, "_GO")
    $Stop = GUICtrlCreateButton("STOP", 41, 138, 81, 41)
    GUICtrlSetOnEvent($Stop, "_Stop")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Local $i

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

    While 1
    Sleep(50)
    If $i="1" Then
    FileWrite($sFilePath, "1, " & @CRLF)
    Sleep(500)
    EndIf
    WEnd

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

    Func _GO()
    $i = "1"
    EndFunc

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

    Func _Stop()
    $i = "0"
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Hi,
    sollte man nicht bei "FileWrite" auch besser "FileOpen" verwenden ? ;)

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GuiOnEventMode", 1)

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

    Global $bool = False
    Global $sFilePath = FileOpen(@ScriptDir & "\test.txt", 1)
    If $sFilePath = -1 Then MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

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

    #Region ### START Koda GUI section ###
    $hGui = GUICreate("Form 1", 159, 220)
    GUISetOnEvent(-3, "_beenden")
    $btnGO = GUICtrlCreateButton("GO", 40, 32, 81, 41)
    GUICtrlSetOnEvent(-1, "_starten")
    $btnStop = GUICtrlCreateButton("STOP", 41, 138, 81, 41)
    GUICtrlSetOnEvent(-1, "_stopen")

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While True
    Sleep(100)
    If $bool Then
    FileWrite($sFilePath, "Wer schreibt der ..." & @CRLF)
    ConsoleWrite('+> schreiben ...' & @CRLF)
    Sleep(500)
    EndIf
    WEnd

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

    Func _starten()
    $bool = True
    EndFunc ;==>_starten

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

    Func _stopen()
    $bool = False
    EndFunc ;==>_stopen

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

    Func _beenden()
    FileClose($sFilePath)
    Exit
    EndFunc ;==>_beenden

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

    #cs
    Quelle: siehe Autoit-Hilfe

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

    Local $file = FileOpen("test.txt", 1)

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

    ; Prüfen, ob Datei im Schreibmodus geöffnet ist
    If $file = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf

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

    FileWrite($file, "Zeile 1")
    FileWrite($file, "Immer noch Zeile 1" & @CRLF)
    FileWrite($file, "Zeile 2")

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

    FileClose($file)
    #ce

    [/autoit]
  • Blubkuh:
    Warum verwendest Du die Variable $i (Z. 23, 31, 35) als String -- was Abgleiche u. U. erschweren kann -- und nicht als (Integer-)Zahl?


    Ich wusste das die Frage kommt ^^
    Und hier meine alles beantwortende Antwort: 42 .... (Weil es funktioniert ;))

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Zitat

    Ich wusste das die Frage kommt ^^
    Und hier meine alles beantwortende Antwort: 42 .... (Weil es funktioniert ;))

    Das Forum ist dazu gedacht dass wir richtige Hilfe/Antworten geben und nicht dass wir irgendeine Funktionierende Lösung posten.
    Wenn du schon weißt dass du beim Vergleich einer Zahl auch wirklich eine Zahl verwenden solltest dann gib dieses wissen doch auch bitte so weiter.

    Mal ganz davon abgesehen, dass hier ein Bool besser geeignet wäre.