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 -

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.

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
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

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