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
Timer Freezen
-
- [ gelöst ]
-
heini -
7. Juni 2009 um 14:50 -
Geschlossen -
Erledigt
-
-
Hallo,
[autoit]
Timer starten, irgendetwas machen, Zeit1 speichern, irgendetwas machen ohne Timer, Timer starten,irgendetwas machen, Zeit2=Zeit1+timerdiff()$start=timerinit()
[/autoit]
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)ciao
Andy -
Oder als Funktion:
[autoit]Global $start, $bisher = 0
[/autoit][autoit][/autoit][autoit]$start = TimerStart()
[/autoit][autoit][/autoit][autoit]
Sleep(1000)
$bisher = TimerStop($start, $bisher)
sleep(3000)
$start = TimerStart()
sleep (1000)
msgbox(0, 0, TimerStop($start, $bisher))Func TimerStart()
[/autoit][autoit][/autoit][autoit]
Return TimerInit()
EndFuncFunc TimerStop($timer, $var)
[/autoit]
Return $var += TimerDiff($timer)
EndFuncSollte 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()
[/autoit] [autoit][/autoit] [autoit]
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$Timer = _TimerInit()
[/autoit]
Sleep(1000)
_TimerPause($Timer)
Sleep(1000)
MsgBox(0, '', _TimerDiff($Timer))
_TimerResume($Timer)
Sleep(1000)
MsgBox(0, '', _TimerDiff($Timer)) -
Und so geht es 100% Kompliziert
Spoiler anzeigen
[autoit]$Time1 = _TimePlay (-1,0)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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
WEndFunc _TimePlay($TimerT = -1,$State = -1)
[/autoit]
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 -
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]
[/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 gehtIch 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.