gpt4 book ai didi

c++ - 结合 GetMessage 和 PeekMessage

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:40 27 4
gpt4 key购买 nike

我打算创建一个带有 2 个窗口的小型应用程序,一个带有控件的普通窗口和一个使用 DirectX 渲染的 3D 窗口。对于 3D 窗口,建议使用 PeekMessage(),因为它不会在检查消息后等待,但对于普通窗口(无 3D 渲染),GetMessage() 函数用于避免处理器无意义的过度使用。因此,当 3D 窗口处于事件状态时(收到 WM_ACTIVE 消息)我想使用 PeekMessage() 并且当普通窗口处于事件状态时我想使用 GetMessage( )

主循环看起来像这样:

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;
// ...
}

我对 TaskManager 的期望是在 3D 窗口处于事件状态时显示应用程序繁忙(~50% 的处理器使用),而在正常窗口处于事件状态时(~5% 的处理器使用)不那么忙。当两个窗口都失去焦点时,我只看到 50% 的处理器使用,但当其中任何一个处于事件状态时,我看到 0-5% 的处理器使用。我相信应该有所不同,所以我不确定这是否真的有效(甚至可能)。呈现 3D 窗口并且普通窗口也响应事件,但处理器的使用让我感到困惑。我只是不希望这影响 3D 窗口的 F​​PS。

最佳答案

您应该检查 3D 窗口是否处于非事件状态,而不是检查普通窗口是否处于事件状态。您还可以使用 WaitMessage 而不是 GetMessage,因为它可以避免重复代码。

例如:

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

您的问题似乎是当普通窗口处于非事件状态时,即使 3D 窗口处于非事件状态,消息循环也不会等待。

如果您决定使用WaitMessage,您还应该在PeekMessage 上循环,因为队列中可能有不止一条消息和WaitMessage直到有新消息到达才返回。

关于c++ - 结合 GetMessage 和 PeekMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com