Объедините GetMessage и PeekMessage

Я намерен создать небольшое приложение с двумя окнами, обычным окном с элементами управления и трехмерным окном, визуализированным с помощью DirectX. Для 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 покажет, что приложение занято (~ 50% использования процессора), когда 3D-окно активно, и не так занято, когда активно обычное окно (~ 5% загрузки процессора). Я вижу только 50% использования процессора, когда оба окна потеряли фокус, но я вижу 0-5% использования процессора, когда любое из них активно. Я считаю, что должна быть разница, поэтому я не уверен, действительно ли это работает (или даже возможно). Отображается трехмерное окно, и обычное окно тоже реагирует на события, но использование процессора смущает меня. Я просто не хочу, чтобы это влияло на FPS 3D-окна.

4

Решение

Вместо того, чтобы проверять, является ли нормальное окно активным, вы должны проверить, является ли 3D-окно неактивным. Вы также можете использовать WaitMessage вместо GetMessage потому что это спасает вас от дублирования кода.

Например:

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

Кажется, ваша проблема в том, что когда обычное окно неактивно, цикл обработки сообщений не ждет, даже если 3D-окно неактивно.

Если вы решили использовать WaitMessageВы должны также зацикливаться на PeekMessage потому что может быть более одного сообщения в очереди и WaitMessage не возвращается, пока не придет новое сообщение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]