PDA

Просмотр полной версии : MFC - отлавливание событий вместе с сообщениями



Lev
12.09.2005, 22:19
Как отловить установку события ( HANDLE EventLaLa= CreateEvent(...) ) в приложении, которое использует MFC ?
далее мой пример:
компонент стороннего производителя используется в моей программе. Моя программа должна узнавать об освободившимся событии EventLaLa, которое устанавливает компонент стороннего производителя, и должна запустить обработчик естественно.
конец примера.

Eugie
13.09.2005, 00:37
Что значит "отловить установку события"? В буквальном смысле - никак. Событие (event) - объект ядра, используется для синхронизации. "Отловить" можно переход данного события в сигнальное состояние, с помощью функций типа WaitForSingleObject, WaitForMultipleObjects и т.д. По-любому, для этого нужен хэндл события, т.е. в твоем случае компонент должен так или иначе обеспечивать доступ к нему (хэндлу).

Absurd
13.09.2005, 09:45
Если объект именованный, то можно сделать OpenEvent()

Lev
13.09.2005, 20:19
с хэндлом проблем нет - он доступен. "отловить установку события" имелось ввиду что событие бывает в двух состояниях: свободное и занятое. Т.е. нужно отловить "установку события в свободное состояние". Извините за неточность.

Eugie
14.09.2005, 11:54
Функции WaitFor... как раз и предназначены для ожидания перехода объекта в свободное состояние (signaled state).
Кстати, в MFC имеются классы-обертки для объектов синхронизации, в частности, CEvent для событий, и классы CSingleLock и CMultiLock, инкапсулирующие функциональность блокировщиков WaitFor...

Lev
14.09.2005, 17:30
спасибо, я посмотрю про эти классы. Но если я запущу функцию типа WaitFor..., то приложение, конечно, проснётся когда событие в сигнальное состояние перейдёт. НО когда оно заснёт от функции WaitFor..., то оно перестанет реагировать на оконные сообщения. Я хочу узнать как сделать чтобы оно реагировало и на то и на другое.

Eugie
14.09.2005, 18:49
На этот случай есть еще пара функций 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

Lev
15.09.2005, 10:47
Ок, про это я знаю. Но в MFC как это сделать? Там ведь выборка сообщений (MessagePump) скрыта внутри классов MFC!

Eugie
15.09.2005, 11:55
No problem - в своем производном от CWinApp (CWinThread) классе переопредели метод Run.

Lev
17.09.2005, 11:34
Понял, спасибо.