Autor Beitrag
TrainMan.exe
Hält's aus hier
Beiträge: 9

Win XP
D6 Pers
BeitragVerfasst: Di 18.11.03 22:05 
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!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9

Win XP
D6 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 132

Knoppix, Win 95, Win 2000, Win NT, Win 98, Win XP
Delphi 3
BeitragVerfasst: Mi 19.11.03 21:13 
Hier ein Beispiel vom Swissdelphicenter. Denke das wäre was für dich, probier's mal aus. ;)

ausblenden volle Höhe 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:

  You want to measure the elapsed time in a repeat, while or a for -Loop 
  to do some optimation ? 

  Sie möchten eine Routine mit einer repeat, while oder for i :=...hinsichtlich der 
  durchlaufenen Zeit messen, um z.B.Optimierungsaktivitäten durchzuführen. 
}
 

// Global Variables, Globale Variablen: 

  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; 
  // Put here some kind of loop: For, While or Repeat 
  for i := 0 to iCounter do... 
  { WHILE.... 
   repeat...until}
 
  { After the Loop/ 
   Nach Abschluss der Schleifenroutine:}
 
    if bOK then 
      QueryPerformanceCounter(t2); 
end

procedure StartSchleife; 
begin 
  LoopRoutine; 
  if bOK then 
    {$IFDEF VER80} 
    // Show the elapsed time: 
    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;