奇怪的测试结果。当我不使用它时,我的win32程序工作得更慢

时间:2010-11-12 17:52:34

标签: c++ winapi

我已经使用QueryPerformanceCounter完成了一些测试并得到了奇怪的结果。 看起来我的简单程序在什么都不做的时候会慢慢刷新(大约40ms),但是当我把RedrawWindow放到RDW_INVALIDATE消息时它刷新并且工作得非常快(大约1ms)

请查看示例:

{...}

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);在主循环中时,我可以获得40ms甚至5ms,但没有RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);条件if(double(now - start)/ PCFreq&gt; = 40)输入no快于45-50毫秒......

我的问题是: 如何避免RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);功能但保持快速刷新。当Iam使用RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);我的界面(按钮,窗口)不显示时。

谢谢!

1 个答案:

答案 0 :(得分:2)

除非消息队列中有消息,否则GetMessage不会返回。通过调用RedrawWindow,您将在循环的每次迭代中将Message放入队列中。使用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
}