Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Uhrzeit genau anzeigen (https://www.delphipraxis.net/30932-uhrzeit-genau-anzeigen.html)

daniel-volk 1. Okt 2004 12:38


Uhrzeit genau anzeigen
 
Hi Leute,

ich habe ein kleines Problem. Ich synchronisiere meine PC-Uhr mit der Atomuhr in Braunschweig.
Das geht ja auf wenige Milliselunden genau.

Ich habe jetzt aber festgestellt, dass die Windows-Uhr nicht so genau bei der Anzeige der Uhrzeit ist. Da ist eine Sekunde schon ruhig mal 1,5 Sekunden oder auch nur 0,7 Sekunden lang (geschätzt). Das variiert von Sekunde zu Sekunde.

Ich möchte also ein Prog schreiben, dass mir die Uhrzeit so genau wie möglich anzeigt, und zwar auf 1/100 Sekunde genau. Wie mache ich das am sinnvollsten?
Es gibt dabei mehrere Probleme: Wenn ich die Zeit über ein großes Label ausgebe, dann flackert das bei jeder Aktualisierung.
Außerdem wird die in Delphi verfügbare Variable "Time" nur ca. alle 100-stel Sekunde aktualisiert (variiert auch je nach Rechengeschwindigkeit des PC).

Wie also bekomme ich die genaue Zeit und wie zeige ich diese möglichst ohne Zeitverlust an?!

Vielleicht kennt ja auch jemand von euch ein solches Programm. Sehr sinnvoll wäre es ja, wenn das Programm die Zeit über Maschinensprache abfragen würde, aber auf dem Gebiet ist meine Weisheit dann endgültig am Ende angekommen.

MfG,
Daniel.

Matze 1. Okt 2004 12:49

Re: Uhrzeit genau anzeigen
 
Zitat:

Zitat von daniel-volk
Es gibt dabei mehrere Probleme: Wenn ich die Zeit über ein großes Label ausgebe, dann flackert das bei jeder Aktualisierung.

Hier im Forum suchenApplication.ProcessMessages

Zitat:

Zitat von daniel-volk
Außerdem wird die in Delphi verfügbare Variable "Time" nur ca. alle 100-stel Sekunde aktualisiert (variiert auch je nach Rechengeschwindigkeit des PC).

Das sollte nicht am PC liegen, sondern wenn, dann am OS.

WInXP kann 10 ms darstellen, Win9x hingegen nur 50 ms.
Dann müsstest du dir einen anderen Timer besorgen, der das kann, evtl bei www.torry.net schauen.

Hier im Forum suchenAtomuhr
Da gibt es ein Topic von Chakotay, ob er dir etwas bringt, weiß ich nicht.

Dax 1. Okt 2004 12:50

Re: Uhrzeit genau anzeigen
 
Du könntest dir die aktuelle Systemzeit nehmen und mit dem Wert von MSDN-Library durchsuchenQueryPerformanceCounter synchronisieren, das heisst, du setzt das Ergebnis der Funktion als die aktuelle Systemzeit(intern). Dann holst du dir den Wert von MSDN-Library durchsuchenQueryPerformanceFrequency. Dieser Wert gibt an, wie oft pro Sekunde der Wert von QueryPerformanceCounter hochgezählt wird. Wenn du beide Werte verrechnet hast, kannst du Idelaerweise die Zeit auf Mikrosekunden genau angeben.

daniel-volk 1. Okt 2004 14:16

Re: Uhrzeit genau anzeigen
 
Hi,

erstmal danke für eure Antworten.

@Matze:
Application.ProcessMessages verwende ich sowieso, aber trotzdem flackert das. Ich denke mal, dass das beim zeichnen des Labels passiert. Liegt wohl daran, dass die Schrift so groß ist.

Aber ganz interessant finde ich die Sache von Dax. Was genau machen denn der QueryPerformanceCounter under die QueryPerformanceFrequency?
Der Zusammenhang zwischen der QPF und dem QPC ist mir schon klar, aber was genau gibt mir der QPC raus? Ist das ein Wert, der zwischen meinem letzten Befehl und jetzt vergangen ist?

Wie kann ich damit denn die Uhrzeit synchronisieren? Und wie erhalte ich diese Werte überhaupt?

MfG,
Daniel.

Dax 1. Okt 2004 14:27

Re: Uhrzeit genau anzeigen
 
Die QueryPerformanceFrequency-Funktion gibt dir einen Wert vom Typ Int64 zurück.
Jede Sekunde wird der QueryPerformanceCounter um diesen Wert erhöht, immer in gleichmäßigen Abständen, ist in der Hardware eingebaut. Das bedeutet auch, das der QPC beim Systemstart Null ist.
Das heisst, wenn QPF = 1000 wird jede Millisekunde der QPC um 1 erhöht, normalerweise liegt QPF über 3 Millionen.

Mit "synchronisieren" meinte ich, dass du für einen Wert der Uhrzeit, sagen wir, 12 Uhr, den Wert des QPCs speicherst. Jedesmal, wenn du danach den QPC holst, ziehst du den alten Wert, den du verher gespeichert hast, ab.
Wenn du diesen Endwert durch QPF teilst, bekommst du die Anzahl der Sekunden nach dem checken der Systemzeit durch dein Programm. Wenn du den Wert durch (QPF/1000) teilst, bekommst du die Millisekunden, ... ad infinitum.

Die einzige Grenze bildet in diesem Fall die Integer-genauigkeit, du kannst also auf einem normalen Rechner wohl nicht bis in den Nanosekunden-Bereich vorstossen, aber Mikrosekunden sind schon drin. (Weiss ich aus eigener Erfahrung).


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz