Wann geht ElapsedMilliseconds wieder auf null

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Wann geht ElapsedMilliseconds wieder auf null

Beitrag von Danilo »

Code: Alles auswählen

;
; by Danilo
;
; 64bit ElapsedMilliseconds for 32bit systems
;
; http://www.purebasic.fr/english/viewtopic.php?f=5&t=59401
;
; - Must be used with quad variables (.q)
; - Because of signed Quads in PB, this overflows after 106751991167 days (round about 292471208 years)
; - Must be called at least once within 49 days (unsigned Long overflow after 49.7 days)
;
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86

    Procedure.q ElapsedMilliseconds_64()
        Static ElapsedMilliseconds_64_oldValue.q = 0                ; value of last call
        Static ElapsedMilliseconds_64_overflow.q = 0                ; how many overflows occured
        Protected current_ms.q = ElapsedMilliseconds() & $FFFFFFFF  ; get new value as unsigned number
        If ElapsedMilliseconds_64_oldValue > current_ms             ; If old value is greater than new value
            ElapsedMilliseconds_64_overflow + 1                     ;     increment overflow by 1
        EndIf
        ElapsedMilliseconds_64_oldValue = current_ms
        ProcedureReturn current_ms + ElapsedMilliseconds_64_overflow * $FFFFFFFF ; return current value + overflows
    EndProcedure

    Macro ElapsedMilliseconds()
        ElapsedMilliseconds_64()
    EndMacro
    
CompilerEndIf

For i = 0 To 20
    ms.q = ElapsedMilliseconds()
    Debug ms
    Delay(20)
Next
Die Funktion muss allerdings mindestens einmal alle 49 Tage aufgerufen werden, um keinen Überlauf zu verpassen (weil unsigned Long nach 49,7 Tagen überläuft).
So sollte es dann 292471208 Jahre laufen. Danach geht es in den negativen Bereich.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: Wann geht ElapsedMilliseconds wieder auf null

Beitrag von auser »

Linux und PB zählt ab der Startzeit vom Programm weg. Siehe hier: http://www.purebasic.fr/german/viewtopi ... 78#p317978 - In Windows ist's mehr oder weniger von Laufzeit vom PC abhängig ... wobei das immer relativer wird und ab Win8.1 scheinbar sogar SHIFT gedrückt werden muss oder die Laufzeit geht trotzt "Herunterfahren" trotzdem weiter.

Ich würde für so Msec-Zeiträume empfehlen entweder einen 32bit Wert mittels Differenz zu prüfen ...wobei da wirklich auch das Ergebnis 32bit bleiben muss damit auch da der Überlauf nachvollzogen wird (check.l = Elapsedmilliseconds() - timeout.l) oder man nimmt halt 64bit große Werte (in Linux z.B. von gettimeofday() - Beispiel im obigen Link) dann läuft es erst über wenn wir und unsere Enkelkinder längst alle tot sind.
Antworten