c++ - 奇怪的测试结果。当我不使用时,我的 win32 程序运行得更慢

标签 c++ winapi

我用 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); 在主循环中时,我可以获得 exacly 40ms 甚至 5ms,但没有 RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE ); 条件 if ( double(now - start)/PCFreq >= 40) 的输入速度不超过 45-50 毫秒....

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

谢谢!

最佳答案

除非消息队列中有消息,否则 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
}

关于c++ - 奇怪的测试结果。当我不使用时,我的 win32 程序运行得更慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4167581/

相关文章:

c++ - 在构造函数中清零结构

html - 使用 Delphi 2009 下载任何网页并将其保存为 Unicode?

c++ - 我做了一个悬垂的引用吗?

c# - 您会使用什么语言在内存棒上实现自动更新/同步功能?

更改 OpenGL 上下文的大小

c++ - 如何为 AD 组使用 AllocateAndInitializeSid?

c++ - 与非常轻量级的 "DEFINE NATIVE ENTRY"函数相比,为什么 Dart 中的原生包装函数如此重量级?

c++ - 退出应用程序前关闭线程

c++ - 尽管调用者期望完全相同的类型,但从std::function类型传递变量失败

c++ - 是否可以在编译时计算数字阶乘,但没有枚举