我用QueryPerformanceCounter完成了一些測試,結果很奇怪。 看來,我的簡單程序速度變慢(約40毫秒),當它在做什麼,但是當我把RedrawWindow與RDW_INVALIDATE消息,它刷新,而且運作非常快(1ms左右)奇怪的測試結果。當我不使用它時,我的win32程序運行速度較慢
請看例子:
{...}
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);
的條件,如果(雙(現在 - STA rt)/ PCFreq> = 40)輸入不超過45-50ms ....
我的問題是: 我該如何避免RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
函數,但保持快速刷新。當Iam使用RedrawWindow(hwnd, NULL, NULL, RDW_VALIDATE);
我的界面(按鈕,窗口)不顯示。
謝謝!
只有在有消息要處理時才調用QueryPerformanceCounter。你想要測量什麼? – nos 2010-11-12 18:00:55
我們是否應該假定有一個調用QueryPerformanceFrequency的地方,以便PCFreq不是0? – 2010-11-12 18:04:14
QueryPerformanceCounter可以在多處理器系統上打破,你應該使用timegettime。 – stonemetal 2010-11-12 19:18:38