Einzelnen Beitrag anzeigen

AndreasZZZ

Registriert seit: 30. Jul 2003
11 Beiträge
 
Delphi 7 Professional
 
#1

Zeitbestimmung nur genau auf 10 Millisekunden

  Alt 27. Apr 2004, 09:22
Hallo,

ich weiss, dass zum Thema Genauigkeit von Zeitfunktionen schon viel geschrieben wurde, aber zu meinem Problem konnte ich noch nichts passendes finden. Auch Torry's Delphi-Page oder Suche hier im Forum oder in den Newsgroups war wenig erfolgreich.

Ich habe sehr viel gefunden zum Thema Zeitmessung über GetTickCount oder QueryPerformanceFrequency/QueryPerformanceCounter aber mir geht es um die absolute Zeitbestimmung.

Ich habe ein Programm, das über IdTCPServer Telegramme von etwa Kommunikationspartners empfängt. Alle Telegramme werden mitprotokolliert. Das Logfile sieht wie folgt aus:
2004.04.27 10:07:01.125 - RCV: <Telegramminhalt Anfragetelegramm>
2004.04.27 10:07:01.145 - SND: <Telegramminhalt Antwortelegramm>

Mit fiel nun auf, dass nahezu alle Logfileeinträge mit 5 endeten, d.h. 10:07:01.125, 10:07:01.145, 10:07:01.155, 10:07:01.165 etc.
D.h. zwischen den Telegrammen lager IMMER entweder 10 oder 0 Millisekunden. Das kam mir merkwürdig vor.
Die Zeit ermittle ich durch NOW und schreibe sie mit FormatDateTime als String in das Logfile.

Zuerst dachte ich, dass das Schreiben ins Logfile 10 Millisekunden dauern würde, also habe ich nur Bildschirmausgaben gemacht, aber das Ergebnis blieb gleich.

Dann habe ich ein kleines Testprogramm geschrieben:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const MAXANZ=10;
var i : Integer;
var dtTest: Array[1..MAXANZ] of TDateTime;
begin
  WriteLn('Test mit NOW');
  for i:=1 to MAXANZ do
  begin
    dtTest[i]:=Now;
    Sleep(3);
  end;
  for i:=1 to MAXANZ do
  begin
    Write(dtTest[i]:0:15);
    WriteLn(' - '+FormatDateTime('HH:NN:SS.ZZZ',dtTest[i]));
  end;

  WriteLn('Test mit TIME');
  for i:=1 to MAXANZ do
  begin
    dtTest[i]:=Time;
    Sleep(3);
  end;
  for i:=1 to MAXANZ do
  begin
    Write(dtTest[i]:0:15);
    WriteLn(' - '+FormatDateTime('HH:NN:SS.ZZZ',dtTest[i]));
  end;
  ReadLn;
end.
Ich schreibe zuerst nur in ein Array und mache anschliessend die Bildschirmausgabe. Mit dem Sleep(3) sollte sich die Bildschirmausgabe um je 3 Millisekunden unterscheiden. Tut sie aber nicht:

Code:
Test mit NOW
38104.425165578701100  -  10:12:14.306
38104.425165694447100  -  10:12:14.316
38104.425165810185700  -  10:12:14.326
38104.425165925924400  -  10:12:14.336
38104.425166041663000  -  10:12:14.346
38104.425166157409000  -  10:12:14.356
38104.425166157409000  -  10:12:14.356
38104.425166273147600  -  10:12:14.366
38104.425166388886300  -  10:12:14.376
38104.425166504632200  -  10:12:14.386

Test mit TIME
0.425184710648148  -  10:12:15.959
0.425184826388889  -  10:12:15.969
0.425184942129630  -  10:12:15.979
0.425185057870370  -  10:12:15.989
0.425185173611111  -  10:12:15.999
0.425185289351852  -  10:12:16.009
0.425185405092593  -  10:12:16.019
0.425185520833333  -  10:12:16.029
0.425185636574074  -  10:12:16.039
0.425185752314815  -  10:12:16.049
Es liegen immer genau 10 oder 0 Millisekunden (10:12:14.356) dazwischen. Wenn ich mir dann den TDateTime ansehe, dann stimmt der Werden bis auf 15 Stellen nach dem Komma exakt überein.

In den Hilfe steht, das NOW nicht für Millisekunden geeignet ist, daher habe ich auch TIME genommen, aber das Ergebnis bleibt gleich.

Dauert ein Aufruf von NOW oder TIME wirklich 10 Millisekunden? Kann ich mir nicht vorstellen. Und was ist mit den exakt übereinstimmenden Werten?
Gibt es eine genauere und/oder schnellere Version von NOW oder TIME?

Ich verwende Delphi 7 Professional.

Bye
Andreas
  Mit Zitat antworten Zitat