Ereignis (Flag) muss über einen bestimmten Zeitraum bestehen

  • Hi leute, ich hab folgendes Problem. Ich prüfe in einer While Schleife einen bestimmten Zustand welchen ich in einer If Abfrage in einem bestimmten Intervall abfrage z.b. so.

    [autoit]


    If NOT Dll xyz = 1 Then
    MsgBox(0,"Status", "Zustand A", 3)
    Sleep (30000)
    Else
    MsgBox(0,"Status", "Zustand B", 3)
    ;Tue folgendes......

    [/autoit]

    Meine Frage ist jetzt wie schaffe ich es (wahrscheinlich mit einer for-schleife), wenn Zustand B erreicht wird, das erst nach einer bestimmten Zeit z.b. 3 Minuten eine Aktion ausgeführt wird, aber auch nur dann, wenn zu diesem Zeitpunkt der Zustand noch existiert.

    Für eine Antwort wäre ich sehr Dankbar.

    Einmal editiert, zuletzt von horst290 (2. Januar 2011 um 23:14)

  • Hallo horst290,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem:

    • Zu allerst solltest du dein komplettes Skript posten
    • soll dass Ereignis die ganzen 3 Sekunden bestehen oder reicht es wenn es nach 3 Sekunden (zufällig wieder ansteht)
    • eine Erläuterung zu deinem Vorhabem wäre nicht schlecht, da man sich dann besser hineindenken kann,

    Frohes gutes neues Jahr

  • Es wird ein bestimmtes Signal abgefragt, dieses ist hat auch nur 2 Zustände.

    Besteht dieses Signal jetzt länger als z.b. 3 Minuten dauerhaft soll erst eine Aktion durchgeführt werden.

    Es reicht also nicht ein Sleep einzubauen, das nach 3 Minuten einfach versendet, sondern es muss nach 3 Minuten prüfen ob Zustand B noch besteht.

    Wegen den Hilfen Danke, da hab ich mich schon durchgewühlt aber bin bisher nicht schlauer daraus geworden.

  • Beispiel:

    Spoiler anzeigen
    [autoit]

    HotKeySet("s", "_Set")

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

    $bZustand = False

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

    While True
    If $bZustand Then
    $Timer = TimerInit()
    While $bZustand And Sleep(20)
    If TimerDiff($Timer) > 60000 * 3 Then
    _Test() ;3 Minuten
    ExitLoop
    EndIf
    WEnd
    EndIf
    WEnd

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

    Func _Test()
    MsgBox(0, "", "Zustand für 3 Minuten True gewesen")
    EndFunc

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

    Func _Set()
    $bZustand = True
    EndFunc

    [/autoit]
  • Besteht dieses Signal jetzt länger als z.b. 3 Minuten dauerhaft soll erst eine Aktion durchgeführt werden.

    dann solltest du dir

    [autoit]

    TimerInit;und
    TimerDiff

    [/autoit]

    anchauen,

    da du kein komplettes Skript eingestellt hast, heir ein Simlationsskript zum Verständnis:

    Spoiler anzeigen
    [autoit]

    $bEventB = False ;liegt da Ereignis And
    $bFirst = True ;um

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

    AdlibRegister("SimulateEventB", Random(2900, 3500, 1))
    ; mit den beiden Zahlen zu Simulationstwecken spielen
    ;die Mindeszeit < 3000 , die Maximumzeit grösser 3000
    ;je gröser die Differenz desto warscheinlicher ist es,
    ;da Zustand B über 3 Sekunden vorkommt
    SimulateEventB()

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

    While 1
    If $bEventB Then
    $iEventB_Start = TimerInit()
    if $bFirst Then
    ConsoleWrite("Zustand B liegt an" & @CRLF)
    $bFirst =False
    EndIf
    While $bEventB And TimerDiff($iEventB_Start) < 3000
    Sleep(50) ;je nach dem wie genau es sein muss anpasen aber nicht unter 10
    WEnd
    ;### Tidy Error: If/ElseIf statement without a then..
    If TimerDiff($iEventB_Start) >= 3000 Then
    ConsoleWrite("Zustand B liegt noch an, Ereignis ausführen" & @CRLF)
    Exit
    Else
    ConsoleWrite("Zustand B lag nicht lange genug an" & @CRLF)
    $bFirst = True
    SimulateEventB()
    EndIf
    Else
    ConsoleWrite("Zustand B liegt nicht an" & @CRLF)
    EndIf
    WEnd

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

    Func SimulateEventB() ;zum imulieren
    $bEventB = Not $bEventB
    EndFunc ;==>SimulateEventB

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

    mfg autoBert

  • Letzter Code Stand ist folgender (Beispielcode, vielleicht hilft es jemanden)

    [autoit]


    Global $Versorgung1 = ""
    Global $Versorgung2 = ""
    Global $dif
    Global $dif2 = StringLeft($dif, StringInStr($dif, ".") -1)
    Global $Count = int($dif/1000)
    Global $60Count = Int($Count / 60)
    Global $begin = TimerInit()

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

    While 1

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

    $Minutes = 5 ; will wait 5 minutes
    $60Count = 0

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

    While $Minutes > $60Count

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

    If $Versorgung2 Then
    ;Setze Timer zurueck
    $begin = TimerInit()
    ;MsgBox(0,"",".......",1)
    Sleep (1000)
    EndIf

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

    If $Versorgung1 Then
    $dif = TimerDiff($begin)
    TrayTip("Test","......"&$Count&" Sekunden.",45)
    Sleep (20)
    EndIf

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

    If $Versorgung1 AND $Count >= 300 Then
    TrayTip("""","Test",60)
    ;fuehrt funktion aus
    ;Setze Timer zurueck
    $begin = TimerInit()
    ;Warte 30 min ....
    Sleep (1800000)
    EndIf

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

    Sleep (20)
    WEnd
    WEnd

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