Windows для профессионалов


Пробуждение потока с использованием объектов ядра или флагов состояния очереди - часть 3


Возьмем простой пример Допустим, в очереди по токи находятся два сообщения о нажатии клавиш. Если теперь вызвать MsgWaitForMul tipleObjects(Ex) и задать в dwWakeMask значение QS_INPUT, поток пробудится, извле чет из очереди первое сообщение и обработает его Но на повторный вызов MsgWait ForMultipleObjects(Ex) поток никак не отреагирует — ведь новых сообщений в очере ди нет.

Этот механизм создал столько проблем разработчикам, что Microsoft пришлось добавить в MsgWaitForMultipleObjectsEx поддержку флага MWMO_INPUTAVATLABLE

Вот как надо писать цикл выборки сообщений при использовании MsgWaitForMul tipleObjectsEx

BOOL fQuit = FALSE; // надо ли завершить цикл?

while (!fQuit)
{

// поток пробуждается при освобождении обьекта ядра ИЛИ
// для обработки сообщения от пользовательского интерфейса

DWORD dwResult = MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE);

switch (dwResult}
{

case WAIT_OBJECT_0:

// освободилось событие
break;

case WAIT_OBJECT_0 + 1:

// в очереди появилось сообщение
// разослать все сообщения MSG msg;

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{

if (msg.message == WM_QUIT)
{

// сообщение WM_QUIT - выходим из цикла
fQuit = TRUE;

}
else
{

// транслируем и пересылаем сообщение
TranslateMessage(&msg);
DispatchMessage(&msg);

}

}

// наша очередь пуста
break;

}

}

// конец цикла while




Начало  Назад  Вперед



Книжный магазин