2013-04-05 56 views
3

我打算創建一個帶有兩個窗口的小應用程序,一個帶有控件的正常窗口和一個使用DirectX呈現的3D窗口。對於3D窗口,推薦使用PeekMessage(),因爲它在檢查消息之後不等待,但是對於正常窗口(不進行3D渲染),則使用GetMessage()函數來避免處理器無意識的過度使用。 因此,當3D窗口處於活動狀態(接收到WM_ACTIVE消息)時,我想使用PeekMessage(),並且當正常窗口處於活動狀態時,我想使用GetMessage()合併GetMessage和PeekMessage

主循環應該是這樣的:

NormalWindowActive = false; 
Window3DActive = false; 
MSG msg; 

while (TRUE) { 
    if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    if (NormalWindowActive) { 
     if (GetMessage(&msg, NULL, 0, 0)) { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } else { 
     RenderWindow(); 
    } 
} 

在這些窗口的消息處理程序我有WM_ACTIVATE消息:

HWND NormalWindow, Window3D; // These windows are global vars 

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
    // ... 
    case WM_ACTIVATE: 
     if (wParam!= WA_INACTIVE) { 
      if (hWnd == NormalWindow) { 
       NormalWindowActive = true; 
       Window3DActive = false; 
      } else { 
       Window3DActive = true; 
       NormalWindowActive = false; 
      } 
     } 
    break; 
    // ... 
} 

我從任務管理預期是顯示應用在3D窗口處於活動狀態時處於忙碌狀態(〜50%的處理器使用),而在正常窗口處於活動狀態時(佔用5%的處理器)不太繁忙。當兩個窗口失去焦點時,我只看到50%的處理器使用,但是當它們中的任何一個處於活動狀態時,我看到0-5%的處理器使用。我相信應該有所不同,所以我不確定這是否真的有效(甚至可能)。 3D窗口被渲染並且正常窗口也響應事件,但是處理器使用令我困惑。我只是不希望這會影響3D窗口的FPS。

+0

與其試圖推斷任務管理器發生的事情,爲什麼不簡單地放入計數器並計算您使用GetMessage與PeekMessage的次數?然後你可以測試一下,並用調試器打開並檢查計數器。 – 2013-04-05 15:45:35

+0

我現在就這樣做。謝謝 – ali 2013-04-05 15:46:17

+0

用OutputDebugString()添加一些跟蹤語句,這很難用斷點調試。 – 2013-04-05 15:50:31

回答

0

不是檢查普通窗口是否處於活動狀態,而是檢查3D窗口是否處於非活動狀態。您也可以使用WaitMessage而不是GetMessage,因爲它可以避免複製代碼。

例如:

if (Window3DActive) 
    RenderWindow(); 
else 
    WaitMessage(); 

您的問題似乎是,當正常的窗口是無效的,消息循環不等待,即使3D窗口處於非活動狀態。

如果你決定使用WaitMessage,你也應該在PeekMessage循環,因爲有可能是在隊列中不止一個消息,WaitMessage不返回,直到有新郵件到達。