2010-11-12 16 views
2

我用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);我的界面(按鈕,窗口)不顯示。

謝謝!

+0

只有在有消息要處理時才調用QueryPerformanceCounter。你想要測量什麼? – nos 2010-11-12 18:00:55

+0

我們是否應該假定有一個調用QueryPerformanceFrequency的地方,以便PCFreq不是0? – 2010-11-12 18:04:14

+0

QueryPerformanceCounter可以在多處理器系統上打破,你應該使用timegettime。 – stonemetal 2010-11-12 19:18:38

回答

2

除非消息隊列中有消息,否則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 
} 
+0

當消息可用時,PeekMessage'返回一個非零值,不一定是'TRUE'。 – MSN 2010-11-12 18:20:39

+0

@PigBen - 謝謝,這是我一直在尋找的!現在工作正常! @nos和@Rob肯尼迪 - 謝謝,我使用這個計時器準確地獲得40ms(25fps) - 我必須顯示我的圖像緩衝區 – mateusz 2010-11-12 18:22:49

+0

@MSN:它返回BOOL類型,如果它不是TRUE或FALSE,該問題應該向微軟報告。 – 2010-11-12 18:24:18

相關問題