2 Stimmen

Seltsames Testergebnis. Mein Win32-Programm arbeitet langsamer, wenn ich es nicht benutze

Ich habe einige Tests mit QueryPerformanceCounter durchgeführt und seltsame Ergebnisse erhalten. Es scheint, dass mein einfaches Programm erfrischt langsam (ca. 40ms), wenn es nichts tut, aber wenn ich RedrawWindow mit RDW_INVALIDATE Nachricht setzen es aktualisiert und arbeitet sehr schnell (ca. 1ms)

Bitte sehen Sie sich die Beispiele an:

{...}

double PCFreq = 0.0;
__int64 now = 0, start = 0;

LARGE_INTEGER li;

PCFreq = double(li.QuadPart)/1000;

AllocConsole( );  
freopen("CONOUT$", "wb", stdout);

double delay;

while (GetMessage (&messages, NULL, 0, 0))
{
        QueryPerformanceCounter(&li);    
        now = li.QuadPart;

        if ( double(now - start) / PCFreq >= 40)
        {
                **// painting !!!**

         cout <<  double(now - start) / PCFreq << "\n";
         start = now;
        }

        // !!!!!!
        **RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);** 

        TranslateMessage(&messages);
        DispatchMessage(&messages);

    }

    FreeConsole( );   

{...}

Wenn die RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); ist, kann ich in der Hauptschleife genau 40ms oder sogar 5ms erreichen, aber ohne RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); die Bedingung if ( double(now - start) / PCFreq >= 40) wird nicht schneller als 45-50 ms eingegeben....

Meine Frage ist: Wie kann ich vermeiden RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); Funktion, aber halten Sie die schnelle Auffrischung. Wenn ich verwende RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); meine Schnittstelle (Tasten, Windows) nicht anzeigt.

DANKE!

2voto

Benjamin Lindley Punkte 99114

GetMessage kehrt nur dann zurück, wenn eine Nachricht in der Nachrichtenwarteschlange vorhanden ist. Durch den Aufruf von RedrawWindow legen Sie bei jeder Iteration der Schleife eine Nachricht in die Warteschlange. Verwenden Sie PeekMessage anstelle von GetMessage:

while (true)
{
    if (PeekMessage(&messages, NULL, 0, 0, PM_REMOVE))
    {
        if (messages.message == WM_QUIT)
            break;
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    // Do your stuff here
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X