erreicht ElapsedMilliseconds() auch mal seine Obergrenze?
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
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
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)
PB Last Final / (Sometimes testing Beta versions)
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
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 -
- auch "umgeknickt" wird und im negativen Bereich weitergeht, etwa so:
Keine Ahnung, ob das geht.
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
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Wenn Du meinst!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, ...
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
...

... 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)
PB Last Final / (Sometimes testing Beta versions)
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
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.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
Code: Alles auswählen
start = %1111111111111111111111111111111
stop = %1111111111111111111111111111111 + 5000
Debug start
Debug stop
Debug stop-start
Signatur und so
- 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
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Da haste wohl Recht. Aber warum diff auch unbedingt long sein muss leuchtet mir nicht ganz ein.
Signatur und so
- 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
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Die Differenz ist IMMER richtig wenn diese unter 47.x Tage liegt.
Auch beim Nulldurchgang (Überlauf) des Timers...
Mal vorzeichenhaftete Ganzzahlberechnungen anschauen.
In diesen Fall kann man den Überlauf einfach ignorieren und kommt zum richtigen Ergebnis.
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
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Ne, Nic hat schon recht.
Unter 64bit ist "diff" ein Quad (halt 64bit Integer). Und dadurch kommt's beim "Umbruch" zu einer Abweichung/Fehler.
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
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
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive