Seite 2 von 2
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 07:12
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 08:14
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 -
- 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.
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 08:31
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 11:30
von Derren
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 11:37
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 16:20
von Derren
Da haste wohl Recht. Aber warum diff auch unbedingt long sein muss leuchtet mir nicht ganz ein.
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 30.01.2014 17:27
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 31.01.2014 23:07
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.
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 31.01.2014 23:27
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
Re: erreicht ElapsedMilliseconds() auch mal seine Obergrenze
Verfasst: 31.01.2014 23:44
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