Странный результат теста.Моя программа win32 работает медленнее, когда я ее не использую - PullRequest
2 голосов
/ 12 ноября 2010

Я провел несколько тестов с QueryPerformanceCounter и получил странные результаты. Кажется, моя простая программа обновляется медленно (около 40 мс), когда ничего не делает, но когда я помещаю RedrawWindow с сообщением RDW_INVALIDATE, она обновляется и работает очень быстро (около 1 мс)

Пожалуйста, посмотрите на примеры:

{...}

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( );   

{...}

Когда RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); находится в основном цикле, я могу получить точно 40 мс или даже 5 мс, но без RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE); условие if (double (сейчас - начало) / PCFreq> = 40) вводится не быстрее, чем 45-50 мс ....

Мой вопрос: Как можно избежать функции RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);, но быстро обновлять. Когда я использую RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);, мой интерфейс (кнопки, окна) не отображается.

СПАСИБО!

1 Ответ

2 голосов
/ 12 ноября 2010

GetMessage не возвращается, если в очереди сообщений нет сообщений.Вызывая RedrawWindow, вы помещаете сообщение в очередь на каждую итерацию цикла.Используйте PeekMessage вместо 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...