Permanente Zustandsabfrage / Schleifen SOFORT verlassen

  • Hallo,

    mir ist jetzt schon öfters das Problem begegnet, dass ich z.B. eine Abfrage eines Zustandes permanent ausgeführt haben will, während eine andere Schleife durchlaufen wird. So wie in diesem Script:

    [autoit]

    #include <Misc.au3>
    Global $counter = 0
    Global $StartStop = False

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

    While 1
    If _IsPressed ( 78 ) Then
    Sleep (50)
    If Not _IsPressed ( 78 ) Then
    $counter = $counter +1
    Call ( "RunStop" )
    EndIf
    EndIf
    WEnd

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

    Func RunStop()
    If $counter = 1 Then
    $StartStop = True
    Call ( "Befehlskette" )
    EndIf
    If $counter = 2 Then
    $StartStop = False
    $counter = 0
    EndIf
    EndFunc

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

    Func Befehlskette()
    Do
    ;bliebige Befehle
    Until $StartStop = False
    EndFunc

    [/autoit]

    Hier will ich eigentlich nur die 2. Schleife (mit beliebigen Befehlen) durch die Taste F9 (78) starten und auch wieder verlassen. Jedoch wird die 1. Schleife, die Taste F9 abfragt nicht mehr weiter ausgeführt, wenn die 2. Schleife aktiv ist.

    Ja, mit dem Befehl "HotKeySet" würde die Überprüfung des Tastendrucks auch während eine andere Schleife durchlaufen wird funktionieren. Leider funktioniert der Befehl "HotKeySet" in meinem speziellen Fall nicht.

    Jedoch ist es ja möglich mit dem Befehl "HotKeySet" oder z.B. wie bei jedem beliebigen Programm mit einer GUI und einem X oben rechts Zustände permanent abzufragen. Daher frage ich mich, wie wird das gemacht?
    Zwei Schleifen gleichzeitig auszuführen ist ja anscheinend mit AutoIt nicht möglich. Geht das ganze überhaupt mit AutoIt?

    Eine weitere Frage, ist es möglich eine Schleife SOFORT zu verlassen, wenn eine Bedingung erfüllt wird und nicht erst, wenn die Schleife zu Ende ist und diese Bedingung erfüllt wird? Der Befehl "ExitLoop" hilft mir in so einem Fall ja leider auch nicht weiter, so lange der Sleep-Timer läuft.

    [autoit]

    While $Bedingung = True
    MsgBox ( 0, "x", "test" )
    Sleep ( 4000 )
    WEnd

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

    ;or

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

    Do
    MsgBox ( 0, "x", "test" )
    Sleep ( 4000 )
    Until $Bedingung = False

    [/autoit]

    MfG, cantax

    • Offizieller Beitrag

    Hier will ich eigentlich nur die 2. Schleife (mit beliebigen Befehlen) durch die Taste F9 (78) starten und auch wieder verlassen.


    Das kannst du ganz simpel mit zwei HotKeys lösen (einen zum Beenden).

    Spoiler anzeigen
    [autoit]


    HotKeySet('{F9}', '_SwitchLoop')
    HotKeySet('{F7}', '_Exit')
    Global $fSwitch = False

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

    _Loop1()

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

    Func _Loop1()
    ConsoleWrite('Start Loop-1' & @CRLF)
    While Not $fSwitch
    ; irgendwas
    ConsoleWrite('Loop-1' & @CRLF)
    Sleep(500)
    WEnd
    _Loop2() ; Aufruf Schleife 2
    EndFunc

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

    Func _Loop2()
    ConsoleWrite('Start Loop-2' & @CRLF)
    While $fSwitch
    ; irgendwas
    ConsoleWrite('Loop-2' & @CRLF)
    Sleep(500)
    WEnd
    _Loop1() ; Rückkehr zu Schleife 1
    EndFunc

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

    Func _SwitchLoop()
    $fSwitch = Not $fSwitch
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Wenn man mit Autoit echte zeitgleiche Ausführung realisieren will führt in der Regel kein Weg an multiplen Prozessen vorbei. In deinem Fall könntest du z.B. einen Hauptprozess nutzen, welcher nichts anderes macht als die gedrückten Tasten auszuwerten und die Funktionen die wirklich etwas (zeitintensives) tun in extra Scripte auslagern. Das Hauptscript nutzt dann run(...) um die anderen Scripte auszuführen und sofern keine komplexere Kommunikation zwischen den Scripten realisiert wird processclose(...) um diese abzubrechen. Daten wie z.B. eine globale statische Zählervariable oder die Prozess IDs von paralell laufenden Prozessen könnte man per Parameter an die untergeordneten Prozesse weitergeben.

    Wenn man das richtig machen will muss man sich aber auch mit den verschiedensten Möglichkeiten zur Inter Prozess Kommunikation beschäftigen.

  • Vielen Dank für die ganzen Antworten, letztendlich hat mir der Befehl "AdlibRegister" weitergeholfen. Ich werde mir jedoch eueren anderen Vorschläge auch noch anschauen =)

    Gruß, cantax