我用 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/