Loggen Sie mit Zeitstempeln, die Millisekunden Genauigkeit und Auflösung in Windows C ++ haben

8

Ich bin mir bewusst, dass zur Zeitgenauigkeit Funktionen wie timeGetTime, timeBeginPeriod, QueryPerformanceCounter usw. großartig sind, die sowohl eine gute Auflösung als auch eine gute Auflösung bieten. Genauigkeit, aber nur basierend auf Zeit seit dem Start, ohne direkte Verbindung zur Uhrzeit.

Ich möchte jedoch Ereignisse nicht als solche zeitlich festlegen. Ich möchte in der Lage sein, einen genauen Zeitstempel (lokale Zeit) zu erzeugen, so dass ich ihn für jede Eingabe in einer Protokolldatei anzeigen kann, z. B. 31-12-2010 12: 38: 35.345. (Ich brauche die Millisekundengenauigkeit)

Die Standard-Windows-Zeitfunktionen, wie GetLocalTime, geben zwar Millisekundenwerte aus, haben aber keine Millisekunden-Auflösung, abhängig vom laufenden Betriebssystem. Ich benutze XP, daher kann ich nicht viel besser erwarten als etwa 15ms Auflösung.

Was ich brauche, ist eine Möglichkeit, das Beste aus beiden Welten zu erreichen, ohne einen großen Overhead zu erzeugen, um die erforderliche Ausgabe zu erhalten. Zu große Methoden / Berechnungen würden bedeuten, dass der Logger während seiner Operation zu viel Zeit aufwenden würde.

Was wäre der beste / einfachste Weg, dies zu tun?

    
Dave 31.12.2010, 12:51
quelle

5 Antworten

5

Zuerst einige Funktionen:

%Vor%

Nun, wie zu verwenden:

%Vor%

Beachten Sie, dass Sie d1 und u1 in 2-3 Minuten einmal synchronisieren sollten, um die Genauigkeit zu erhalten. Tatsächlich können Sie die Drift zwischen den Uhren messen, um das optimale Resynchronisationsintervall zu finden.

    
Lior Kogan 31.12.2010, 14:56
quelle
5

Sie können GetSystemAsFileTime versuchen, was die Zeit ausdrückt in Einheiten von 100 Nanosekunden. Sie sind bei Windows, um zu bestimmen, mit welcher tatsächlichen Auflösung es gefüllt wird.

Alternative Methode ist nur die lokale Zeit abzufragen und QueryPerformanceCounter zu verwenden, um ein Offset-Zeit-Verhältnis beim Start der Anwendung zu sperren und dieses auf nachfolgende Zählerstände anzuwenden.

    
Steve-o 31.12.2010 13:03
quelle
0

Ich habe einmal den Code dafür geschrieben, aber irgendwann aufgegeben und mit der OS-Zeitauflösung Frieden geschlossen. Der Code nannte sowohl GetLocalTime als auch QueryPerformanceCounter 50 Mal eine enge Schleife. Wenn ich feststelle, dass das Ergebnis von GetLocalTime um einen Auflösungs-Tick geändert wurde, nehme ich an, dass das Ergebnis des entsprechenden QueryPerformanceCounters nahe genug am Anfang dieses Ticks liegt. So bekomme ich einen genauen Zeitversatz. Von diesem Zeitpunkt an rufe ich QueryPerformanceCounter auf und berechne mit Zeitversatz, um eine genaue Ortszeit zu erhalten.

Am Ende habe ich gefolgert, dass all das nicht so viel Mühe wert ist und dass ich nicht wirklich all diese Präzision brauche.

    
Dialecticus 31.12.2010 13:11
quelle
0

Was ich tun würde ist, die Systemzeit und den Abfragezähler beim Start zu bekommen. Sie wissen, haben einen einigermaßen genauen Ausgangspunkt.

Rufen Sie dann QueryPerformanceCounter () in Ihrem Log-System auf, subtrahieren Sie den Start-QPC-Wert, dividieren Sie durch QPF, um Sekunden zu erhalten (in Doppelspeichern), kombinieren Sie diesen Wert mit der Systemzeit beim Starten und Drucken.

    
Macke 31.12.2010 13:41
quelle
0
%Vor%

Bitte beachten Sie, dass dieser Code zwei undokumentierte Dinge, TIME_FILEDS Struktur und RtlTimeToTimeFields Funktion verwendet. Ich verwende eine ähnliche Implementierung in meinem Code und es funktioniert gut auf allen aktuellen WIN NT-Aromen. Es ist jedoch nicht garantiert, dass dies unter der nächsten WIN NT-Version portabel ist.

    
Vikram.exe 31.12.2010 14:36
quelle

Tags und Links