Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit Stoppuhr
TrainMan.exe - Di 18.11.03 22:05
Titel: Probleme mit Stoppuhr
Ich habe mal eine Stoppuhr im Millisekunden-Bereich programmiert. Jetzt habe ich allerdings ein paar Probleme:
1. Wenn ich bei einen Timer mit einem Interval von einer Millisekunde eine Variable immer um 1 vergrößere und diesen Wert auf einem Panel anzeigen lasse, erscheinen nur Hundertstel-Sekunden (3 Stellen)
2. Wenn ich das ganze mit gettickcount löse funktioniert soweit alles, außer dass die letzte Stelle ungefähr im 0,5 Sekunden-Takt läuft.
3. Wie kann ich die Zeit der Stoppuhr im Format hh:mm:ss,msmsms (00:00:00,000) anzeigen lassen?
Danke für eure Antworten!
Delete - Di 18.11.03 22:38
So gar nicht. Die auflösung des Timner unter Consumer Windows beträgt 50 ms. Bei Windows NT ff. kommst du besten falls auf 10 ms runter. Da WM_TIMER Nachrichten eine sehr niedrige Priorität haben, ist auch nicht gesagt, dass in jedem Intervall eine ankommt.
Nimm einen Multimediatimer oder weich auf QueryPerformanceCounter / QueryPerformanceFrequency aus.
TrainMan.exe - Mi 19.11.03 15:57
Das mit QueryPerformanceFrequency hab ich auch schonmal gelesen, habe aber nirgendwo eine Beschreibung gefunden, wie man damit arbeiten kann.
Licki - Mi 19.11.03 21:13
Hier ein Beispiel vom Swissdelphicenter. Denke das wäre was für dich, probier's mal aus. ;)
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
|
t1, t2, Res: TLargeInteger; bOk: BOOL;
implementation
uses Windows, dialogs;
procedure StartTimer; begin bOK := QueryPerformanceFrequency(Res); if bOK then QueryPerformanceCounter(t1); end;
procedure StopTimer; begin if bOK then QueryPerformanceCounter(t2); end;
procedure LoopRoutine; var iCounter: integer; begin StartTimer; for i := 0 to iCounter do... if bOK then QueryPerformanceCounter(t2); end;
procedure StartSchleife; begin LoopRoutine; if bOK then {$IFDEF VER80} MessageDlg('Der Schleifendurchlauf dauerte: ' + Format('%g Sekunden.', [(t2.QuadPart - t1.Quadpart) / Res.QuadPart])); $Else {$IFDEF VER120} MessageDlg('Der Schleifendurchlauf dauerte: ' + Format('%g Sekunden.', [(t2 - t1) / Res])); {$ENDIF} end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!