Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Uhrzeit auf die Millisekunde (https://www.delphipraxis.net/92315-uhrzeit-auf-die-millisekunde.html)

Crazymodder 17. Mai 2007 20:48


Uhrzeit auf die Millisekunde
 
Mh
hab mal wieder ne kleine Frage wollt wissen wie es möglich ist die Uhrzeit auf die Millisekunde genau auszulesen. Also die normale mit Stunde minute Sekunde krieg ich hin aber ich hätte gerne zusaätzlich die Millisekunden.
Wäre über eure Hilfe sehr Dankebar.
mfg.
Crazymodder

Umezawa 17. Mai 2007 20:55

Re: Uhrzeit auf die Millisekunde
 
Wozu so genau?



Du kannst doch zu anang jeder sec einen zähler laufen lassen.

Die Muhkuh 17. Mai 2007 21:00

Re: Uhrzeit auf die Millisekunde
 
Schau Dir mal Delphi-Referenz durchsuchenDecodeTime bzw. Delphi-Referenz durchsuchenEncodeTime an.

Crazymodder 17. Mai 2007 21:02

Re: Uhrzeit auf die Millisekunde
 
Thx für die super schnellen Antworten werde mal gleich die Hilfe durchstöbern thx

fLaSh11 17. Mai 2007 22:56

Re: Uhrzeit auf die Millisekunde
 
Nur für den Fall, dass du etwas messen willst, solltest du dir einmal den QueryPerformanceCounter anschauen.

QuickAndDirty 18. Mai 2007 07:49

Re: Uhrzeit auf die Millisekunde
 
DAS GEHT NICHT
Soweit ich weiß arbeitet die Interne UHR nur mit 18,2 impulsen pro sekunde (18,2 Herz)
für Millisekunden bräuchte man 1000 Herz.
Die Millisekunden werden offensichtlich nur mitgeführt um die Rundungsfehler zu minimieren.

Die Muhkuh 18. Mai 2007 08:03

Re: Uhrzeit auf die Millisekunde
 
Trotzdem nimmt man zum Messen Delphi-Referenz durchsuchenGetTickCount oder Delphi-Referenz durchsuchenQueryPerformanceCounter. Es gibt ja noch einen Counter, glaub ich, dessen Name mir gerade nicht einfällt.

QuickAndDirty 18. Mai 2007 08:12

Re: Uhrzeit auf die Millisekunde
 
Sicher, nur kann man so nicht Millisekunden genau messen.
Damit sich das irgendwie ausgleicht, müste man einen wiederholbaren Vorgang mehrmals messen
und ein Statistischesmittel errechnen.
Oder Du verwendest professionelles Equipment.

TStringlist 18. Mai 2007 10:31

Re: Uhrzeit auf die Millisekunde
 
@Crazymodder, die Uhrzeit? In "NOW" sind doch die Millisekunden immer auch schon mit dabei!

Delphi-Quellcode:
label1.Caption := FormatDateTime('hh:nn:ss:zzz', NOW);

Jelly 18. Mai 2007 10:42

Re: Uhrzeit auf die Millisekunde
 
Zitat:

Zitat von TStringlist
@Crazymodder, die Uhrzeit? In "NOW" sind doch die Millisekunden immer auch schon mit dabei!

Ja, aber eben nur auf 15 msec genau. Genauer kann man damit nicht rechnen.
Probierts aus:
Delphi-Quellcode:
procedure TForm27.Button1Click(Sender: TObject);
var
  t, t1: TDateTime;
  t0: TDateTime;
begin
     t := now ;
     t0 := t ;
     listbox1.Items.BeginUpdate;
     while now - t0 < EncodeTime (0,0,3,0) do begin
         t1 := now ;
         if t <> t1 then begin
             listbox1.items.add (formatDateTime ('s, zzz',t1-t)) ;
             t := now ;
         end;
     end ;
     listbox1.Items.EndUpdate;
end;
GetTickCount hingegen ist auf die msec genau.

Crazymodder 18. Mai 2007 10:47

Re: Uhrzeit auf die Millisekunde
 
Perfekt so reichts mir Danke :-D :-D
Ihr seit echt geil

Jelly 18. Mai 2007 11:06

Re: Uhrzeit auf die Millisekunde
 
In der SDK hab ich folgende nützliche Funktion gefunden:
Zitat:

Zitat von SDK
High-Resolution Timer

A counter is a general term used in programming to refer to an incrementing variable. Some systems include a high-resolution performance counter that provides high-resolution elapsed times.


If a high-resolution performance counter exists on the system, the QueryPerformanceFrequency function can be used to express the frequency, in counts per second. The value of the count is processor dependent. On some processors, for example, the count might be the cycle rate of the processor clock.

The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter. By calling this function at the beginning and end of a section of code, an application essentially uses the counter as a high-resolution timer. For example, suppose that QueryPerformanceFrequency indicates that the frequency of the high-resolution performance counter is 50,000 counts per second. If the application calls QueryPerformanceCounter immediately before and immediately after the section of code to be timed, the counter values might be 1500 counts and 3500 counts, respectively. These values would indicate that .04 seconds (2000 counts) elapsed while the code executed.

QueryPerformanceFrequency gibt die Frequenz an, mit der ein Counter (QueryPerformanceCounter) hochgezählt wird. Die Frequenz f ist prozessorabhängig, und 1/f gibt die Genauigkeit an. Auf meinem System ist f z.B. 3579545, und ich hab somit eine maximale Genauigkeit von 279 ns.
Mit QueryPerformanceCounter liest du den aktuellen Wert aus. Die Differenz von 2 Aufrufen gibt dir die Anzahl der Ticks an. Diesen Werte geteilt durch die Frequenz gibt dir die Differenz in Sekunden aus.

QuickAndDirty 18. Mai 2007 11:15

Re: Uhrzeit auf die Millisekunde
 
Guter Beitrag Jelly.
Das habe ich bis jetzt noch nicht gewust.
Dieser Counter wird nicht von irgendwelchen Stromspar modi beeinflusst?

Jelly 18. Mai 2007 11:19

Re: Uhrzeit auf die Millisekunde
 
Zitat:

Zitat von QuickAndDirty
Dieser Counter wird nicht von irgendwelchen Stromspar modi beeinflusst?

Das weiss ich nicht. Aber sollte dem so sein, so müsste doch der über QueryPerformanceFrequency ermittelte Wert sich ändern, oder?

Sidorion 18. Mai 2007 11:56

Re: Uhrzeit auf die Millisekunde
 
Die Funktion NOW ist auf die Millisekunde genau (da sie intern (BS) auch mit GetTickcount usw hantiert), manche Werte lassen sich aber nicht darstellen.
Zur Erklärung: TDateTime ist im Prinzip ein einfacher Double-Wert, in dessen Ganzzahlteil die Tage seit Wasweisichwann dargestellt werden, im Nachkommateil die Millisekunden seit 0 Uhr. Eine ms ist sozusagen ein 86400000stel eines Tages, also 1,157407407...*10^-8.
Da eine ms schon einen periodischen Dezimalbruch darstellt, ist die Warscheinlchkeit sehr hoch, dass auch ein vielfaches davon periodisch (auf Basis 10). Dieser Wert muss zudem binär dargestellt werden (Basis 2), was die Stelligkeit stark erhöht.
Da nun bestimmte Millisekunden den Darstellungsbereich(Genauigkeit) eines Doubles sprengen muss gegebenenfalls gerundet (Basis 2) werden. Diesen gerundeten Wert kann man dann aber halt nur mit einem Fehler zurückwandeln.
Es ist also nicht die Funktion ungenau, sondern das Ergebnis, was aber im Prinzip auf das Gleiche rauskommt.

Hawkeye219 18. Mai 2007 13:00

Re: Uhrzeit auf die Millisekunde
 
Hallo,
Zitat:

Zitat von Jelly
GetTickCount hingegen ist auf die msec genau.

Wir sollten hier besser von "Auflösung" sprechen, denn Genauigkeit <> Genauigkeit.

Gruß Hawkeye

Jelly 18. Mai 2007 13:05

Re: Uhrzeit auf die Millisekunde
 
Ja. Deshalb hab ich anschliessend nochmal GetPerformanceFrequency und GetPerformanceCounter aufgeführt.

QuickAndDirty 18. Mai 2007 13:08

Re: Uhrzeit auf die Millisekunde
 
das Basisdatum in delphi ist der 30.12.1899 00:00
Vor dem Komma sind ganze tage nach dem Komme sind Stunden,Minuten, Sekunden udn angebliche "Millisekunden"
um Rundungsfehler zu minimieren.
Da Fließkomma zahlen mit zunehmendem Betrag ungenauer (schlechter aufgelöste nachkommastellen )werden kann das wirklich auch
die Darstellung ein probelem sein.

WS1976 18. Mai 2007 13:53

Re: Uhrzeit auf die Millisekunde
 
Hallo Siderion,

ich muss dir leider widersprechen und zwar heftig.
Now und alle damit zusammenhängenden Datum-Uhrzeitquellen hängen am Timertick Interrupt.
Dieser wird alle ca 55ms ausgelöst. Dmentsprechend wird der Wert von now erhöht.
Die Genauigkeit der Zeitmessung hat also überhaupt nichts mit der mathematischen Auflösung
und deren Problematik zu tun, sonder hängt einfach damit zusammen, dass nur ca alle 55msec gezählt
wird. Die Auflösung ist damit beschränkt.
Etwas anders stellt sich die Sache mit QueryPerformanceFrequency dar. Da diese Funktion jedoch nicht auf jedem System zur Verfügung steht kann man sie getrost vergessen.

Grüsse

TStringlist 18. Mai 2007 17:24

Re: Uhrzeit auf die Millisekunde
 
Hm, der Umfragesteller sprach ja auch nur vom Auslesen einer Uhrzeit, nicht aber von irgendwelchen Stoppzeiten o. Zeitdifferenzen. Das wäre natürlich schon etwas anderes gewesen ...und das dann vieldiskutierte NOW wäre in der Truhe geblieben :mrgreen:

Und von daher: Wenn es dem Threadmaker aber tatsächlich nur um eine solche normale Uhrzeit ging (was ja vllt. nicht unbedingt so sein muss), dann wäre natürlich auch die Nutzung von "QueryPerformanceCounter" nur relativ. Denn dann bliebe ihm immer noch das Problem, wo er eine exakte Anfangszeit herbekommt, welche dann nämlich ebenfalls auf die Millisekunde genau zu sein hätte. Selbst wenn er die Atomzeit aus dem Internet abfragen würde, könnte er wohl nicht sicher sein, dass da nicht auch noch einige Millisekunden Übermittlungsverzögerung mit drin sind.


@WS1976

55ms, vielleicht früher mal? Heute scheinen es jedenfalls eher Perioden a 16ms zu sein.

@Jelly: "GetTickCount hingegen ist auf die msec genau.“

Das Result von GetTickCount ändert sich übrigens auch nur alle 16 Millisekunden!

Jelly 18. Mai 2007 19:11

Re: Uhrzeit auf die Millisekunde
 
Zitat:

Zitat von TStringlist
Das Result von GetTickCount ändert sich übrigens auch nur alle 16 Millisekunden!

Ja, das ist wohl richtig. Hab ich auch erst nach Beitragerstellung festgestellt :mrgreen:

QuickAndDirty 21. Mai 2007 08:03

Re: Uhrzeit auf die Millisekunde
 
Wir können also zusammenfassen: DAS GEHT NICHT. Wer millisekunden genau messen will soll sich profesionelles Equipment kaufen
oder den Wert statistisch ermitteln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 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