AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Uhrzeit genau anzeigen

Ein Thema von daniel-volk · begonnen am 1. Okt 2004 · letzter Beitrag vom 1. Okt 2004
Antwort Antwort
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#1

Uhrzeit genau anzeigen

  Alt 1. Okt 2004, 13:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Uhrzeit genau anzeigen

  Alt 1. Okt 2004, 13:49
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 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.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Uhrzeit genau anzeigen

  Alt 1. Okt 2004, 13:50
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.
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Uhrzeit genau anzeigen

  Alt 1. Okt 2004, 15:16
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.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: Uhrzeit genau anzeigen

  Alt 1. Okt 2004, 15:27
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).
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:51 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