AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Zeit mit Genauigkeit von 100 Mikrosekunden (Now Ersatz)

Zeit mit Genauigkeit von 100 Mikrosekunden (Now Ersatz)

Ein Thema von stoxx · begonnen am 11. Mär 2010 · letzter Beitrag vom 11. Mär 2010
Antwort Antwort
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#1

Zeit mit Genauigkeit von 100 Mikrosekunden (Now Ersatz)

  Alt 11. Mär 2010, 13:33
Wenn man häufige Zeitstempel benötigt, dann sind die Windows Funktionen (damit auch now unter Delphi) völlig ungeeignet und liefern nur alle 16 ms eine unterscheidbare Zeit.

Also habe ich mal eine Zeitmessung mit 100 Mikrosekunden Genauigkeit entworfen.
Was 10 Zeitstempeln in einer Millisekunde entspricht.



Das ganze wird über Queryperformancecounter realisiert und über eine Synctime.


Um das Problem zu verdeutlichen, es geht um folgende TestCode:

Delphi-Quellcode:
procedure TForm15.TEstClick(Sender: TObject);
var
  sl : TStringList;
  cnt : Integer;
  zeit, zeit2 : TDAteTime;
  zeit3 : DATETIME;
begin

   cnt := 0;
   sl := TStringList.Create;

   while true do begin
      inc(cnt);
      zeit := Now;
      zeit2 := NowHiRes;
      zeit3 := NowHiRes;

      sl.Add( 'Now Normal Res: ' + FormatDateTime('hh:nn:ss zzzz', zeit ) +
            ' - Now High Res : ' + FormatDateTime('hh:nn:ss zzzz', zeit2 ) +
            ' - NowDT HiRes: ' + zeit3.ToString('hh:nn:ss zzzz'));

      if cnt > 50000 then begin
          memo1.Lines.Text := sl.Text;
          break;
      end;
   end;
   sl.free;
end;
dieser erzeugt folgende Ausgabe


Delphi-Quellcode:
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3120
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3121
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3122
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3123
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3124
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 312 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 312 - NowDT HiRes: 13:17:36 3125
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3126
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3127
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3128
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129
Now Normal Res: 13:17:36 328 - Now High Res : 13:17:36 313 - NowDT HiRes: 13:17:36 3129

man sieht folgendes Problem:

die Millisekunden bleiben lange zeit bei 312, und springen dann irgendwann plötzlich auf 328.
die Funktion NowHiRes zählt aber 100 Mikrosekunden weise hoch.
erst 3120 und das nächste ist 3121

Bei der Formatierung auf Mikrosekunden hatte ich im Moment keine Lust, nachzudenken.

Nur bitte nicht wunden, um die Mikrosekunden auszugeben, habe ich mal schnell
meine eigene DATETIME Klasse benutzt, die auf Integerbasis mit 6 Byte Größe auf 100 Mikrosekunden Genauigkeit ausgelegt ist. (Ersparnis von 2 Byte gegenüber Double).
Die Genauigkeit steckt aber garantiert im Double Wert drin! Auch wenn sich der geneigte Leser noch eine eigene Ausgabe basteln muss.


so, nun zur eigentlichen Funktion NowHiRes:
(Zuweisebare typisierte Konstanten müssen angekreuzt sein, oder man baut den Code um auf globael Variablen)


Delphi-Quellcode:
function Inc100MicroSeconds(const AValue: TDateTime; const ANumberOf100Microseconds: Int64): TDateTime;
begin
  Result := ((AValue * MSecsPerDay * 10) + ANumberOf100Microseconds) / (MSecsPerDay * 10);
end;

//==============================================================================

function NowHiRes : Double;
const
  frequency : TLargeInteger = 0;
  Sync : TLargeInteger = 0;
  Current : TLargeInteger = 0;
  SyncTime : Double = 0;
  LastRequestetTime : Double = 0;

begin

  if frequency = 0 then begin
      QueryPerformanceFrequency(frequency);
  end;

  if SecondsBetween(now, syncTime) > 30 then begin
     QueryPerformanceCounter(Sync);
     result := now;
     SyncTime := result;

     if result <= LastRequestetTime then begin
         result := Inc100MicroSeconds(LastRequestetTime,1);
         SyncTime := 0;
     end;

     LastRequestetTime := result;
  end else begin
     QueryPerformanceCounter(Current);
     Result := Inc100MicroSeconds(SyncTime, round( (Current - Sync) / Frequency * 10000));
     LastRequestetTime := result;

  end;
end;

//==============================================================================
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Zeit mit Genauigkeit von 100 Mikrosekunden (Now Ersatz)

  Alt 11. Mär 2010, 15:37
- Konstanten sind in "normalen" Programmen standardmäßig nicht beschreibbar
(Hinweis auf entsprechenden Compilerschalter fehlt)
Zitat:
[DCC Fehler] Unit2.pas(43): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
- Konstanten sind Konstanten und speziell bei einem Code für die CodeLib sollte man, vorallem bezüglich Rücksicht auf "unerfahrene" Programmierer, diese nicht als globale Variablen mißbrauchen

- ich kann jetzt auf die schnelle auch nicht erkennen, daß irgendwo erwähnt wird, daß die Zeit in dem TDateTime NICHT der realen Zeit entspricht, sondern daß einfach nur Zwischenwerte Uhrzeitunabhängig "emuliert" werden ... jedenfalls wird auf diesen Sachverhalt nicht hingewiesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#3

Re: Zeit mit Genauigkeit von 100 Mikrosekunden (Now Ersatz)

  Alt 11. Mär 2010, 17:23
Hallo Himitsu,

vielen Dank für die Hinweise.
direkt "böse" globalen Variablen sind das ja nicht, da sie nur für die Procedure Gültigkeit haben, denke ich mir mal so.
Ich möchte zu bedenken geben, dass Anfänger dadurch auch dazulernen können.




"sondern daß einfach nur Zwischenwerte Uhrzeitunabhängig "emuliert" werden ... "

hmm .. was heißt schon emuliert? natürlich schon. Aber jede Zeit ist doch emuliert, ausgerechnet oder sonstwas und stimmt mit der Universellen Sonnenzeit nicht überein, so dass alle paar Jahre mal eine "Schaltsekunde" eingefügt werden muss. Da fehlt doch glatt einfach mal die "Zeit"

Fest steht, dass now und auch GetSystemTime, GetLocalTime und auch andere Zeitfunktionen nur stark gerundete Werte zurückliefern.
Bei häufigen Aufrufen hintereinander wird ein und dieselbe Zeit zurückgeliefert, auf etwa 15 ms gerundet.. bei WinXP.
(und gerade getestet unter Windows7, ist noch nicht besser geworden, war eine Fehlinformation)

Und klar ist auch, wenn ich von Windows nur gerundete Werte zurückbekomme, bzw. langsam aktualisierte, dass meine Zeit nie genauer sein kann, als diese 15 ms,
Eine Möglichkeit wäre nun, wenn man es wirklich ganz genau möchte, die Uhrzeit (SyncZeit in der function) nach Atomzeit zu synchronisieren und eventuelle Ping Laufzeiten korrekt rausrechnen. und dann fortlaufend weiter emulieren
das Wort gefällt mir .. So hätte man eine wirklich exakte, und auch noch hochauflösende Zeitfunktion.


Aber das war ja nicht das Ziel..... für mich ....
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf