2013-04-05 54 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不返回,直到有新邮件到达。