2013-04-05 9 views
3

Я намереваюсь создать небольшое приложение с 2 окнами, обычным окном с элементами управления и 3D-окном, отображаемым с помощью DirectX. Для 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; 
    // ... 
} 

Что я ожидаю от TaskManager, чтобы показать приложение занят (~ 50% использования процессора), когда 3D-окно активно и не так занято, когда нормальное окно активно (~ 5% использования процессора). Я вижу только 50% использование процессора, когда оба окна потеряли фокус, но я вижу 0-5% использования процессора, когда какой-либо из них активен. Я считаю, что должна быть разница, поэтому я не уверен, действительно ли это работает (или даже возможно). 3D-окно визуализируется, и нормальное окно также реагирует на события, но использование процессора меня смущает. Я просто не хочу, чтобы это повлияло на FPS 3D-окна.

+0

Вместо того, чтобы пытаться определить, что происходит из диспетчера задач, почему бы просто не поставить счетчик и подсчитать, сколько раз вы используете GetMessage или PeekMessage? Затем вы можете протестировать его некоторое время и ворваться с отладчиком и проверить счетчики. –

+0

Я сделаю это прямо сейчас. Спасибо – ali

+0

Добавьте некоторые инструкции трассировки с OutputDebugString(), это трудно отлаживать с помощью контрольных точек. –

ответ

0

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

Например:

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

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

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