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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: MFC - отлавливание событий вместе с сообщениями

Lev » 17 сен 2005, 11:34

Понял, спасибо.

Eugie » 15 сен 2005, 11:55

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

Lev » 15 сен 2005, 10:47

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

Eugie » 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 » 14 сен 2005, 17:30

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

Eugie » 14 сен 2005, 11:54

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

Lev » 13 сен 2005, 20:19

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

Absurd » 13 сен 2005, 09:45

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

Eugie » 13 сен 2005, 00:37

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

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

Lev » 12 сен 2005, 22:19

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

Вернуться к началу