Entwickler-Ecke
Windows API - GetTickCount Problem
Mahjong - So 15.02.09 16:08
Titel: GetTickCount Problem
Hallo,
Ich muss momentan mit GetTickCount arbeiten und damit bestimmen wie lange ein bestimmter Programmabschnitt läuft,
mein Ansatz sieht bis jetzt so aus :
Delphi-Quelltext
1: 2: 3: 4: 5:
| time1 := GetTickCount; Prozedur(); time2 := GetTickCount;
label1.caption := intToStr(time2 - time1); |
Seltsamerweiße erhalte ich "0" als Wert. Wenn ich jedoch nach jedem TickCount aufruf die Zeit z.B. per ShowMessage ausgabe funktioniert die Sache. Es scheint als müsste ich die Werte erst irgendwie verarbeiten damit es funtioniert.
Laut der Anleitung an die ich mich halten soll, sollte diese Methode der Zeitmessung genau so funktionieren.
Eingesetzt wird Delphi 2009 auf Vista x64.
Gruß
jaenicke - So 15.02.09 16:14
GetTickCount ist ungenau, alles unter ca. 15-30ms lässt sich damit nicht korrekt messen.
Mach mehrere Durchläufe (100-1000) und teile den Wert dadurch. Und dann gibt es noch QueryPerformanceCounter, das sehr viel genauer ist. Einzelne Werte im < 1 ms Bereich solltest du aber auch damit kaum richtig messen können. Mehrere Durchläufe mit Mittelwert sind da immer am besten.
Mahjong - So 15.02.09 17:32
jaenicke hat folgendes geschrieben : |
GetTickCount ist ungenau, alles unter ca. 15-30ms lässt sich damit nicht korrekt messen.
Mach mehrere Durchläufe (100-1000) und teile den Wert dadurch. Und dann gibt es noch QueryPerformanceCounter, das sehr viel genauer ist. Einzelne Werte im < 1 ms Bereich solltest du aber auch damit kaum richtig messen können. Mehrere Durchläufe mit Mittelwert sind da immer am besten. |
Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen. (Die Mittelwert Sache werde ich jedoch tun). Mein eigentliches Problem besteht jedoch darin das es nicht funktioniert, also auch nicht ungenau.
GetTickCount; gibt mir keine Ergebnisse. Zumindest nicht solange ich dannach kein Showmessage(time1) ausführen, warum auch immer.
jaenicke - So 15.02.09 17:38
Kann es sein, dass danach noch mehr Code folgt, so dass einfach kein Neuzeichnen des Labels erfolgt? Dann müsstest du Application.ProcessMessages oder Label1.Repaint / Label1.Refresh nach der Zuweisung der neuen Caption schreiben. Allerdings kostet das natürlich auch wieder etwas Zeit, in einer Schleife sollte das also ggf. nur alle 100 Durchläufe oder so passieren.
Mahjong hat folgendes geschrieben : |
| Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen. |
Was spricht gegen QueryPerformanceCounter? :gruebel:
Mahjong - So 15.02.09 18:06
jaenicke hat folgendes geschrieben : |
Kann es sein, dass danach noch mehr Code folgt, so dass einfach kein Neuzeichnen des Labels erfolgt? Dann müsstest du Application.ProcessMessages oder Label1.Repaint / Label1.Refresh nach der Zuweisung der neuen Caption schreiben. Allerdings kostet das natürlich auch wieder etwas Zeit, in einer Schleife sollte das also ggf. nur alle 100 Durchläufe oder so passieren.
Mahjong hat folgendes geschrieben : | | Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen. | Was spricht gegen QueryPerformanceCounter? :gruebel: |
Die Meinung der Person deren Kurs ich gezwungen bin zu besuchen :/
(die ProcessMessages muss ich mir ansehen)
Chemiker - So 15.02.09 19:07
Hallo,
Wie ist time1 und time2 deklariert? Es sollte als DWord deklariert sein!
Bis bald Chemiker
Delete - So 15.02.09 19:12
Cardinal geht aber auch ;)
jaenicke - So 15.02.09 19:28
Chemiker hat folgendes geschrieben : |
| Wie ist time1 und time2 deklariert? Es sollte als DWord deklariert sein! |
Schau dir einmal die Deklaration von DWord an. ;-)
Ein DWord bzw. LongWord wird intern als Cardinal umgesetzt. Das siehst du z.B. auch, wenn du die Maus darüber hälst (Turbo Delphi z.B.):
Mahjong - So 15.02.09 20:00
Vielen Dank,
Der Cardinal/DWord Tipp bringt mich weiter, die Ergebnisse sind besser :).
Chemiker - So 15.02.09 20:47
Hallo jaenicke,
ich habe DeddyH nicht widersprochen, aber zur besseren Lesbarkeit sollte man doch als DWord die Variablen deklarieren.
Für Datum/Zeit Variabel benutzt man auch den Type TDateTime und nicht Double.
Bis bald Chemiker
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!