ElapsedMilliseconds() Überlauf

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

ElapsedMilliseconds() Überlauf

Beitrag von mk-soft »

Irgendwann wurde aus mir unbekannten gründen der Rückgabewert von ElapsedMilliseconds() geändert.

Normalerweise geht der Zählwert bei einen Überlauf vom grössten positiven Wert auf den grössten negativen Wert.
Somit ist die Zeit-Differenzberechnung immer richtig.

Funktioniert dieser Überlauf vom Zeitgeber, jetzt nach dem Programmstart, immer noch genauso.
Wenn nicht haben wir ein Problem mit Programmen oder Dienste die immer laufen und die Funktion benutzen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ElapsedMilliseconds() Überlauf

Beitrag von RSBasic »

Benutzt du auch ein Quad für die Variable?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ElapsedMilliseconds() Überlauf

Beitrag von mk-soft »

Darum geht es nicht :wink:
Mir sind durch aus die unterschiede der verschiedenen Variablentypen und deren Bereiche bekannt.

Es steht ja auch in der Hilfe das der Rückgabewert jetzt ein Quad ist. Ich hoffe nur das die interne Umsetzung zu einen Quad funktioniert.
Ich habe teilweise Produktiv-Systeme die Jahrelang nicht abgeschaltet werden, oder nicht neugestartet wurden.
Doch!, sowas gibt es auch mit Windows :mrgreen:

Der Quad Rückgabewert sollte eigentlich immer reichen. Finde aber die Umsetzung bei der X86-Version auf den Quad-Wert sinnlos, da in der alten Version der Rückgabewert der Überlauf richtig durchführt wurde.

Es war, glaube ich, das diese Änderung nur umgesetzt wurde, da einige das mit den Überlauf nicht verstanden haben. :mrgreen:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ElapsedMilliseconds() Überlauf

Beitrag von GPI »

Ein quad sind maximal 9223372036854775807

somit 9223372036854775807 ms
= 9223372036854775,807 sekunden
= 153722867280912,93 minuten
= 2562047788015,21 stunden
= 106751991167,30 tage
= 292471208,67 Jahre (bei festen 365 Tagen pro Jahre)

Ein Überlauf ist völlig uninteressant.

edit: ab Vista wird man vermutlich einfach GetTickCount64() bei Windows benutzen (und bei anderen OS wirds sicherlich ähnliches geben). Den Befehl gibt es ja bei XP nicht, das ist ein "Problem". Aber ElapsedMiliseconds() hat keinen definierten Startzeitpunkt. Rein theoretisch kann er starten, wenn man zum ersten mal die Function aufruft. Scheint auch der Fall zu sein

Code: Alles auswählen

Delay(1000)
Debug ElapsedMilliseconds()
ist hier bei Windows immer Null. Selbst wenn die interne Function nur GetTickCount() verwendet - solange zwischen beiden ElapsedMilliseconds()-Aufrufen weniger als grob 40 Tage liegen, sollte es keinerlei Probleme geben.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: ElapsedMilliseconds() Überlauf

Beitrag von Josh »

mk-soft hat geschrieben:Es war, glaube ich, das diese Änderung nur umgesetzt wurde, da einige das mit den Überlauf nicht verstanden haben. :mrgreen:
Seit ein oder zwei Versionen wird für ElapsedMilliseconds() PureBasic intern QueryPerformanceCounter anstatt GetTickCount verwendet und das erfordert ein Quad als Rückgabewert. Ist ja viel genauer, da GetTickCount nur alle 32 ms (oder so) gezählt hat.

Irgendwie hab ich was im Kopf, dass Fred mal was geschrieben hat, dass ElapsedMilliseconds() bei MacOs und Linux schon immer bei 0 gestartet haben. Bin mir aber nicht mehr ganz sicher.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: ElapsedMilliseconds() Überlauf

Beitrag von #NULL »

http://www.purebasic.fr/english/viewtop ... 45#p501045
ElapsedMilliseconds() should be precise on all OS now as we use PerformanceCounter on Windows and gettimeofday() on Linux/OSX which both have microsecond support. But yes, non of these OS are realtime, so you could approach precise timing but not reach it
http://www.purebasic.fr/english/viewtop ... 43#p503543
It was already like this on OSX and Linux, so I just did the same on Windows. ElapsedMilliseconds() is not from program start, it's between 2 call of it.
Was ist eigentlich die Frage? Ob intern alles richtig ist musst du Fred fragen. Das der erste Aufruf jetzt >=0 zurueckgibt anstatt >0 ist doch eigentlich egal, hoechstens relevant bei RandomSeed(ElapsedMilliseconds()) weil man jetzt wohlmoeglich immer seed 0 benutzt.
my pb stuff..
Bild..jedenfalls war das mal so.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ElapsedMilliseconds() Überlauf

Beitrag von Nino »

= 292471208,67 Jahre (bei festen 365 Tagen pro Jahre)

Ein Überlauf ist völlig uninteressant.
So ist es.
(Auf lange Sicht hat ein Jahr im Durchschnitt 365,2425 Tage.)

Da ElapsedMilliseconds() in den neueren PB-Versionen beim ersten Aufruf mit 0 startet, dauert es bis zu einem Überlauf von ElapsedMilliseconds() selbst theoretisch über 292 Millionen Jahre.

Im Prinzip kann allerdings schon vorher die von ElapsedMilliseconds() aufgerufene API-Funktion überlaufen. Für QueryPerformanceCounter (QPC) unter Windows gilt:
How often does QPC roll over?

Not less than 100 years from the most recent system boot, and potentially longer based on the underlying hardware timer used. For most applications, rollover isn't a concern.
https://msdn.microsoft.com/de-de/librar ... p/dn553408(v=vs.85%29.aspx
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: ElapsedMilliseconds() Überlauf

Beitrag von Helle »

Antworten