Timer Freezen

  • Hi.
    Ich würde gerne wissen wie/ob man einen Timer (TimerInit) für bestimmte Zeit anhalten kann.
    Vielen Dank für die Hilfe.
    MfG
    heini

    Einmal editiert, zuletzt von heini (7. Juni 2009 um 16:38)

  • Hallo,
    Timer starten, irgendetwas machen, Zeit1 speichern, irgendetwas machen ohne Timer, Timer starten,irgendetwas machen, Zeit2=Zeit1+timerdiff()

    [autoit]

    $start=timerinit()
    sleep (1000) ;1 Sekunden warten
    $bisher=timerdiff($Start);bisher abgelaufene Zeit speichern
    sleep(3000) ; irgendetwas machen ohne dass der Timer läuft
    $start=timerinit();Timer wiederaufnehmen
    sleep (1000) ;1 Sekunden warten
    $bisher=$bisher+timerdiff($start) ;die unterbrechungszeit (3 sec) wird nicht gezählt
    msgbox(0,0,$bisher)

    [/autoit]

    ciao
    Andy

  • Oder als Funktion:

    [autoit]

    Global $start, $bisher = 0

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

    $start = TimerStart()
    Sleep(1000)
    $bisher = TimerStop($start, $bisher)
    sleep(3000)
    $start = TimerStart()
    sleep (1000)
    msgbox(0, 0, TimerStop($start, $bisher))

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

    Func TimerStart()
    Return TimerInit()
    EndFunc

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

    Func TimerStop($timer, $var)
    Return $var += TimerDiff($timer)
    EndFunc

    [/autoit]

    Sollte so funktionieren, keine Garantie ;)

  • danke euch beiden, ich hab gehofft man kann das eleganzer lösen aber so passts auch :)

  • So geht es auch, aber keine Garantie auf ganz so exakte Zeiten ;)

    Spoiler anzeigen
    [autoit]

    Func _TimerInit()
    Local $aTimer[2] = [TimerInit(),0]
    Return $aTimer
    EndFunc
    Func _TimerDiff(ByRef $aTimer)
    If $aTimer[0]=-1 Then Return $aTimer[1]
    Return TimerDiff($aTimer[0])+$aTimer[1]
    EndFunc
    Func _TimerPause(ByRef $aTimer)
    If $aTimer[0] = -1 Then Return
    $aTimer[1] += TimerDiff($aTimer[0])
    $aTimer[0] = -1
    EndFunc
    Func _TimerResume(ByRef $aTimer)
    $aTimer[0] = TimerInit()
    EndFunc

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

    $Timer = _TimerInit()
    Sleep(1000)
    _TimerPause($Timer)
    Sleep(1000)
    MsgBox(0, '', _TimerDiff($Timer))
    _TimerResume($Timer)
    Sleep(1000)
    MsgBox(0, '', _TimerDiff($Timer))

    [/autoit]
  • Und so geht es 100% Kompliziert :D:D

    Spoiler anzeigen
    [autoit]

    $Time1 = _TimePlay (-1,0)
    While 1
    $Time1 = _TimePlay($Time1)
    For $1 = 0 To 100
    ToolTip (_TimeGetPos($Time1))
    Sleep (10)
    Next
    $Time1 = _TimePlay($Time1)
    For $1 = 0 To 100
    ToolTip ("Nicht laufen:" & _TimeGetPos($Time1))
    Sleep (10)
    Next
    WEnd

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

    Func _TimePlay($TimerT = -1,$State = -1)
    If $TimerT = -1 Then
    Local $Timer[2]
    $Timer[0] = 0
    $Timer[1] = 0
    Else
    $Timer = $TimerT
    EndIf
    Local $TimerPlay[2]
    $TimerPlay[0] = $Timer[0]
    $TimerPlay[1] = $Timer[1]
    If $Timer[1] = 0 And $State <> 0 Then
    $TimerPlay[1] = TimerInit ()
    ElseIf $Timer[1] <> 0 And $State <> 1 Then
    $TimerPlay[0] += TimerDiff ($Timer[1])
    $TimerPlay[1] = 0
    EndIf
    Return $TimerPlay
    EndFunc
    Func _TimeGetPos($Timer)
    IF $Timer[1] <> 0 Then
    Return $Timer[0] + TimerDiff ($Timer[1])
    Else
    Return $Timer[0]
    EndIf
    EndFunc

    [/autoit]

    mfg. Jam00

  • Nun die hier im Thread vorgestellten Lösungen haben alle eins gemeinsam, die bisher verstrichene Zeit wird in eine separate Variable (bzw. im Array als zweites Element) gespeichert bzw. dort summiert. Dies ist nicht immer so brauchbar.

    Hier mal ein anderer Weg:

    [autoit]


    $start=timerinit()
    sleep (50) ; stellvertretend für irgendeinen Vorgang
    ; hier erfolgt Unterbrechung
    $break = TimerInit() ; für die Unterbrechung einen weiteren Timer starten
    sleep(700) ; Simuliere Unterbrechung
    $start += 1000*3.6 * TimerDiff($break) ; den Startwert des ersten Timers um die Pausenzeit verschieben
    ; Ende der Unterbrechung
    sleep(50) ; ebenso stellvertretend für irgendeinen Vorgang
    ConsoleWrite(TimerDiff($start)&@crlf) ; und siehe da, den geht

    [/autoit]

    Ich musste es so lösen, da ich zum einen in automatischen Vorgängen die Funktion Pause realisiert habe und zum anderen darin drei verschiedene Timer hatte, die gestoppt werden sollten. Die Abfrage der Timer erfolgte aber an anderen Stellen im Code.
    Die Multiplikation mit 1000*3.6 und die Addition kosten zwar etwas Zeit, aber diese ist verschwindend gering im Vergleich zur Reaktionszeit (Bedienzeit) des Users.

    2 Mal editiert, zuletzt von viktorkl (6. Januar 2011 um 22:55)