MFC - отлавливание событий вместе с сообщениями
Модераторы: Duncon, Hawk, Romeo, Eugie
Как отловить установку события ( HANDLE EventLaLa= CreateEvent(...) ) в приложении, которое использует MFC ?
далее мой пример:
компонент стороннего производителя используется в моей программе. Моя программа должна узнавать об освободившимся событии EventLaLa, которое устанавливает компонент стороннего производителя, и должна запустить обработчик естественно.
конец примера.
далее мой пример:
компонент стороннего производителя используется в моей программе. Моя программа должна узнавать об освободившимся событии EventLaLa, которое устанавливает компонент стороннего производителя, и должна запустить обработчик естественно.
конец примера.
Что значит "отловить установку события"? В буквальном смысле - никак. Событие (event) - объект ядра, используется для синхронизации. "Отловить" можно переход данного события в сигнальное состояние, с помощью функций типа WaitForSingleObject, WaitForMultipleObjects и т.д. По-любому, для этого нужен хэндл события, т.е. в твоем случае компонент должен так или иначе обеспечивать доступ к нему (хэндлу).
с хэндлом проблем нет - он доступен. "отловить установку события" имелось ввиду что событие бывает в двух состояниях: свободное и занятое. Т.е. нужно отловить "установку события в свободное состояние". Извините за неточность.
Функции WaitFor... как раз и предназначены для ожидания перехода объекта в свободное состояние (signaled state).
Кстати, в MFC имеются классы-обертки для объектов синхронизации, в частности, CEvent для событий, и классы CSingleLock и CMultiLock, инкапсулирующие функциональность блокировщиков WaitFor...
Кстати, в MFC имеются классы-обертки для объектов синхронизации, в частности, CEvent для событий, и классы CSingleLock и CMultiLock, инкапсулирующие функциональность блокировщиков WaitFor...
спасибо, я посмотрю про эти классы. Но если я запущу функцию типа WaitFor..., то приложение, конечно, проснётся когда событие в сигнальное состояние перейдёт. НО когда оно заснёт от функции WaitFor..., то оно перестанет реагировать на оконные сообщения. Я хочу узнать как сделать чтобы оно реагировало и на то и на другое.
На этот случай есть еще пара функций MsgWaitForMultipleObjects(Ex), они как раз ожидают либо освобождения объекта(-ов) ядра, либо нового события в очереди сообщений. Цикл выборки при этом будет примерно такой:
Код: Выделить всё
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
Ок, про это я знаю. Но в MFC как это сделать? Там ведь выборка сообщений (MessagePump) скрыта внутри классов MFC!
No problem - в своем производном от CWinApp (CWinThread) классе переопредели метод Run.