Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zeitberechner mit QueryPerformanceCounter


beastofchaos - Sa 08.01.11 21:13
Titel: Zeitberechner mit QueryPerformanceCounter
Hallo Leute,
Habe mich mal umgeschaut, aber ich finde in meinem Delphi-Buch, bei Google, Wikipedia und in diesem Forum keine direkte Definition/Erklärung von QueryPerformance-Funktionen.
Ich lerne erst sein ein paar Monaten Delphi und basteln schon an einem Minigolfprogramm für meine Prüfung. Nach anger Zeit und viel Hilfe in diesem Forum, hab ich fast alles bei einander und muss das ganze nur noch zu einem vollen Programm stricken ;) Leider ist ein wichtiger Teil meines Programmes für mich unverständlich, da es mir jemand geschickt hat und ich es nicht selber gemacht habe.

Ein Teil der unverständlichen Prozeduren/Funktionen ist folgende, die die vergangene Zeit liest und für die nächste Bewegegung der Kugel gebraucht wird ( -> Timebased Movements ):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TMainForm.FormCreate(Sender: TObject);
var
begin
  if not [b]QueryPerformanceFrequency(Frequency)[/b] then
    Application.Terminate;
  [b]QueryPerformanceCounter(CalcTime);[/b]
  .
  .
  .
end;


procedure TMainForm.CalcTimestep;
var
  CurrTime: int64;
begin
  [b]QueryPerformanceCounter(CurrTime);[/b]
  Timestep := (CurrTime - CalcTime) / Frequency;
  CalcTime := CurrTime;
end;


procedure TMainForm.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  CalcTimestep;
 .
 .
 .
end;




Was mir auch schon aufgefallen ist, dass die Prozedur "CalcTimestep" selber die vergangene Zeit vom Programmstart("Form.Create") aus berechnet. Aber welche Zeit liest er mit der Funktion QueryPerformanceCounter. Die Zeit vom Programmstart/Pcstart an diesem Zeitpunkt?
Und als zweites verstehe ich nicht, was "QueryPerformaceFrequenz()" anstellt - Was ist hier direkt gemeint mit Frequenz?

Freundliche Grüße, Thomas alias beast ;)


jaenicke - Sa 08.01.11 21:33

Warum schaust du denn nicht einfach einmal in die Doku:
http://msdn.microsoft.com/en-us/library/ms644905(v=vs.85).aspx

Wie genau diese Frequenz zustande kommt, kommt auf die verwendete Hardware an. Je nachdem ist die Frequenz mehr oder weniger nahe an der Prozessortaktfrequenz.


beastofchaos - So 09.01.11 02:04

Hab ich schon einmal gesehen. Hab mir jetzt doch die Mühe gemacht und versucht, das Englisch zu verstehen ( ich bin nicht gut in Engl. ), aber ich weiß leider nicht, was genau "QueryPerformanceCounter" zählt. Welche Zeit - etwa die Zeit von "Delphi-Urknall"(30.12.1899)? Oder nur vom Systemstart? :D
Das ist die einzige wichtige Frage noch... :/

Grüße, Thomas alias beast


jaenicke - So 09.01.11 02:13

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Das ist die einzige wichtige Frage noch... :/
Das weiß man nicht. Das hängt von der Implementierung in der verwendeten Hardware ab. Wofür ist das dir denn wichtig? :gruebel:


beastofchaos - So 09.01.11 02:34

Naja, ich befürchte, dass in der Präsentation, einer der 3 Prüfer mich dann über diese Prozedur abfragt am Ende und ich dahcte, das wäre vll wichtig. Ich sag einfach mal:" Und mit diesem Befehl wird die Systemzeit gelesen und in CalcTime/CurrTime gespeicht :p Dann muss ich nur noc hdie Mathematik in dem doofen Programm ganz vcerstehen und das selbst dann ausbauen ;)
Danke schonmal, deer Thread ist ja dann somit abgeschlossen


jaenicke - So 09.01.11 02:40

Nun, in der Regel sollte es die Anzahl der Prozessortakte seit Systemstart sein. Aber es muss eben nicht so sein. Mehr dazu:
http://en.wikipedia.org/wiki/Time_Stamp_Counter


Bergmann89 - So 09.01.11 02:46

Hey,

ich denke, wenn du deinem Prüfer sagst, was die Funktion macht, bzw wozu sie verwendet wird sollte reichen. Und wenn er doch nachfragt, dann kannst du ihm ja sagen, das diese Funktion vom System bereit gestellt wird und du nix über die genaue Funktionsweiße gefunden hast (gesucht hast du ja). Das dürfte er dir dann nicht als Minuspunkt anrechnen, man kann ja schließlich nicht alles wissen. Genauso könnte er dich fragen welche Subroutinen ausgeführt werden um ein Fenster zu erstellen, denn da benutzt du ja auch eins ;)

MfG Bergmann.


beastofchaos - So 09.01.11 11:40

Gut! danke, ist sicher auch unwarscheinlich, dass sie danach fragen :p


Delete - So 09.01.11 15:52

Erzählt mal einem Neuling keinen Quatsch!

RDTSC hat mit der CPU-Frequenz nichts zu tun!

Die CPU-Frequenz kann man laut INTEL so auslesen:
http://www.delphi-forum.de/viewtopic.php?p=530257#530257

http://www.delphi-forum.de/viewtopic.php?t=87238&highlight=rdtsc