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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

12 сен 2005, 22:19

Как отловить установку события ( HANDLE EventLaLa= CreateEvent(...) ) в приложении, которое использует MFC ?
далее мой пример:
компонент стороннего производителя используется в моей программе. Моя программа должна узнавать об освободившимся событии EventLaLa, которое устанавливает компонент стороннего производителя, и должна запустить обработчик естественно.
конец примера.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

13 сен 2005, 00:37

Что значит "отловить установку события"? В буквальном смысле - никак. Событие (event) - объект ядра, используется для синхронизации. "Отловить" можно переход данного события в сигнальное состояние, с помощью функций типа WaitForSingleObject, WaitForMultipleObjects и т.д. По-любому, для этого нужен хэндл события, т.е. в твоем случае компонент должен так или иначе обеспечивать доступ к нему (хэндлу).
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 сен 2005, 09:45

Если объект именованный, то можно сделать OpenEvent()
2B OR NOT(2B) = FF
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

13 сен 2005, 20:19

с хэндлом проблем нет - он доступен. "отловить установку события" имелось ввиду что событие бывает в двух состояниях: свободное и занятое. Т.е. нужно отловить "установку события в свободное состояние". Извините за неточность.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

14 сен 2005, 11:54

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

14 сен 2005, 17:30

спасибо, я посмотрю про эти классы. Но если я запущу функцию типа WaitFor..., то приложение, конечно, проснётся когда событие в сигнальное состояние перейдёт. НО когда оно заснёт от функции WaitFor..., то оно перестанет реагировать на оконные сообщения. Я хочу узнать как сделать чтобы оно реагировало и на то и на другое.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

14 сен 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
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

15 сен 2005, 10:47

Ок, про это я знаю. Но в MFC как это сделать? Там ведь выборка сообщений (MessagePump) скрыта внутри классов MFC!
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

15 сен 2005, 11:55

No problem - в своем производном от CWinApp (CWinThread) классе переопредели метод Run.
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

17 сен 2005, 11:34

Понял, спасибо.
Ответить