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;
    

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/queryperformancecounter.asp



  • 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.


Anmelden zum Antworten