Wie QueryPerformanceCounter benutzen?
-
Hallo!
Ich schreibe zZ ein Programm, dass den Messablauf eines Sektrumsanalysators steuert. Es handelt sich dabei um eine Messung, die in einem festgesetzten Intervall ständig wiederholt wird. Dieses Intervall ist variabel. Als kleinstmöglichen Wert will ich eine Millisekunde zulassen. eine halbe Millisekunde wäre sogar noch besser.
Dazu will ich den PerformanceCounter verwenden, doch ich weiß nicht welche Bibliotheken ich dafür brauche. Programmiere mit dev-C++. Ich wollte so vorgehen wie hier: http://www.codeworx.org/cpp_tuts_1_3.php
Aber ich weiß nicht, wie ich die winmm.lib einbinde. Habs versucht mit Linkeroptionen: -lwinmm.lib. Klappt nicht.
Er meldet dann, dass er in der mmsystem.h alles mögliche nicht kennt, z.B. DWORD.
Wie geht man denn beim timen strukturell vor? Etwa so:
1. Hole Zeit beim Start der Funktion
2. Hole Zeit nachdem Funkion ausgeführt
3. Vergleiche Differenz mit festgelegtem Intervall, falls kleiner, so wiederhole Schritt 3, falls größer oder gleich, starte Funktion von neuem.Ich hoffe, jemand kann mir weiterhelfen.
-
Hi
hast Du den <windows.h> Header?
Theoretisch so:
CurrentTime = GetTime(); TimeElapsed = (CurrentTime – LastTime) * TimeScale; LastTime = CurrentTime;
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Windows ist keine Echtzeit OS deshlab wirst Du nie auf diese Auflösung kommen, geschweige denn, dass diese garantiert erreicht würde.
QueryPerformanceCounter gehört zu "windows.h" und Du brauchst auch nur diese einzubinden.
PS: Die Frage gehört eher nach WinAPI...
-
zB so:
MSG mssg; // message from queue LONGLONG cur_time; // current time DWORD time_count=40; // ms per frame, default if no performance counter LONGLONG perf_cnt; // performance timer frequency BOOL perf_flag=FALSE; // flag determining which timer to use LONGLONG next_time=0; // time to render next frame BOOL move_flag=TRUE; // flag noting if we have moved yet // is there a performance counter available? if (QueryPerformanceFrequency((LARGE_INTEGER *) &perf_cnt)) { // yes, set time_count and timer choice flag perf_flag=TRUE; time_count=perf_cnt/25; // calculate time per frame based on frequency QueryPerformanceCounter((LARGE_INTEGER *) &next_time); } else { // no performance counter, read in using timeGetTime next_time=timeGetTime(); } // prime the message structure PeekMessage( &mssg, NULL, 0, 0, PM_NOREMOVE); // run till completed while (mssg.message!=WM_QUIT) { // is there a message to process? if (PeekMessage( &mssg, NULL, 0, 0, PM_REMOVE)) { // dispatch the message TranslateMessage(&mssg); DispatchMessage(&mssg); } else { // do we need to move? if (move_flag) { // yes, move and clear flag MoveObjects(); move_flag=FALSE; } // use the appropriate method to get time if (perf_flag) QueryPerformanceCounter((LARGE_INTEGER *) &cur_time); else cur_time=timeGetTime(); // is it time to render the frame? if (cur_time>next_time) { // yes, render the frame RenderFrame(); // set time for next frame next_time += time_count; // If we get more than a frame ahead, allow us to drop one // Otherwise, we will never catch up if we let the error // accumulate, and message handling will suffer if (next_time < cur_time) next_time = cur_time + time_count; // flag that we need to move objects again move_flag=TRUE; } } }
quelle: http://www.mvps.org/directx/articles/writing_the_game_loop.htm
queryperformancecounter hat eine auflösung rund um 1 µs
weitere infos: http://www.mvps.org/directx/articles/selecting_timer_functions.htm
-
Danke für eure Hilfe. Jetzt klappts. Im wesentlichen war folgendes nötig:
meine 64 bit integer sind vom Typ long long
und ich musste die windows.h einbinden.