erreicht ElapsedMilliseconds() auch mal seine Obergrenze?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von helpy »

Hallo zusammen,

ein paar Gedanken dazu:

Warum überhaupt ElapsedMillisecons() verwenden?

Geht es um Zeitdifferenzen die große Zeiträume umfassen?
Braucht man da wirklich Millisekunden als Auflösung?
Reicht da nicht evt. Date/Time aus ... mit einer Auflösung von Sekunden?

Wenn Differenzen für kleine Zeiträume benötigt werden,
dann am besten die Differenz überprüfen, ob sie zu groß ist.
Wenn ja, dann eben entsprechende Schritte einleiten
und Ergebnis korrigieren.

cu,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von es_91 »

Hallo, helpy,

bei mir ging es um die Abfrage einer Einblendungsdauer für eine Meldung im Konsolenfenster. Die Meldung sollte nach 5 Sekunden automatisch verschwinden. Da ist, glaube ich, die millisekundengenaue Abfrage zu bevorzugen, allerdings kann es ja sein, dass während der Einblendung die Obergrenze erreicht wird, da muss man eben aufpassen, dass der Wert, mit dem man die ElapsedMilliseconds() vergleicht -

Code: Alles auswählen

If ElapsedMilliseconds() - 5000 > StartAnzeige
- auch "umgeknickt" wird und im negativen Bereich weitergeht, etwa so:

Code: Alles auswählen

If ElapsedMilliseconds() > Long(StartAnzeige+5000) ; Long() biegt die hohe StartAnzeige + 5000 um, sodass die zusätzlichen 5000 im negativen Bereich Wirkung finden
Keine Ahnung, ob das geht.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von helpy »

es_91 hat geschrieben:bei mir ging es um die Abfrage einer Einblendungsdauer für eine Meldung im Konsolenfenster. Die Meldung sollte nach 5 Sekunden automatisch verschwinden. Da ist, glaube ich, die millisekundengenaue Abfrage zu bevorzugen, ...
Wenn Du meinst!
Für mich wäre es egal ob das +/- 1s abweicht. Und wenn es mind. 5s sein soll, dann kann man das ja so abfragen:

Code: Alles auswählen

...

Ausblenden = Date() + 5

... 

if Date() > Ausblenden :  ... : Endif

...
Damit liegt die Zeit zwischen 5 und 6 Sekunden ;-)

... aber wie schon angedeutet:
==> Das liegt in der Freiheit und den Präferenzen, Vorlieben, Gewohnheiten des Programmierers ;-)

lg,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von Derren »

ts-soft hat geschrieben:http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Ist ein long und nach 49,7 Tagen fängt es wieder bei 0 an. Da PB vorzeichenbehaftete longs verwendet,
ist nach der Hälfte der Zeit auch mit negativen Zahlen zu rechnen
Und die Distanz zwischen fast 31bit und knapp über -31bit wird von PB auch wieder korrekt berechnet. ElapsedMilliSeconds() wird nicht dir sagen können, ob der Rechner jetzt 49,7 Tage läuft oder 99,4, aber nachdem du ja nur ein Zwischen Intervall benötigst, dass kleiner als 49,7 Tage ist, gibt es absolut kein Problem.

Code: Alles auswählen

start = %1111111111111111111111111111111
stop = %1111111111111111111111111111111 + 5000

Debug start
Debug stop
Debug stop-start
Signatur und so
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von NicTheQuick »

Dein Beispiel ist leider etwas unanschaulich, wenn man ein 64-Bit-System nutzt. Da werden dann nämlich 64-Variablen benutzt. So ist es schöner:

Code: Alles auswählen

Define start.l = %1111111111111111111111111111111
Define stop.l = %1111111111111111111111111111111 + 5000

Debug start
Debug stop
Define diff.l = stop - start
Debug diff
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von Derren »

Da haste wohl Recht. Aber warum diff auch unbedingt long sein muss leuchtet mir nicht ganz ein.
Signatur und so
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von NicTheQuick »

Weil unter 64-Bit folgendes passiert:

Code: Alles auswählen

Define start.l = %1111111111111111111111111111111
Define stop.l = %1111111111111111111111111111111 + 5000

Debug start
Debug stop
Debug stop - start
Define diffI.i = stop - start
Debug diffI
Define diff.l = stop - start
Debug diff 
Debugger Output hat geschrieben:2147483647
-2147478649
-4294962296
-4294962296
5000
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von mk-soft »

Die Differenz ist IMMER richtig wenn diese unter 47.x Tage liegt.
Auch beim Nulldurchgang (Überlauf) des Timers...

Code: Alles auswählen

Define time.l

time = $7FFFFFFF - 10

For i = 1 To 5
  start = time
  time + 5
  ende = time
  diff = ende - start
  Debug "Time ms: " + Str(time)
  Debug "Diff ms: " + Str(diff)
Next
Mal vorzeichenhaftete Ganzzahlberechnungen anschauen.
In diesen Fall kann man den Überlauf einfach ignorieren und kommt zum richtigen Ergebnis.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von Derren »

Ne, Nic hat schon recht.
Unter 64bit ist "diff" ein Quad (halt 64bit Integer). Und dadurch kommt's beim "Umbruch" zu einer Abweichung/Fehler.

Code: Alles auswählen

Define time.l

time = $7FFFFFFF - 10

Define start.q
Define ende.q
Define diff.q

For i = 1 To 5
  start = time
  time + 5
  ende = time
  diff = ende - start
  Debug "Time ms: " + Str(time)
  
  Select diff
      Case 5
        Debug "Diff ms: " + Str(diff)
      Default
        Debug "--------- F E H L E R: Diff ms: " + Str(diff)
  EndSelect 
Next
Signatur und so
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze

Beitrag von mk-soft »

Die Variablen "start, ende, diff" müssen natürlich den gleichen Type haben wie der Timer.

Bei GetTickCount den Type Long und bei getTickCount64 den Type Quad
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten