Как разработать более чистую цепочку сообщений PostMessage в WinApi / MFC

У меня есть приложение с графическим интерфейсом MFC, которое имеет несколько фреймов (что-то вроде поведения Outlook с главным окном и окнами сообщений / встреч, которые создаются в новых фреймах, или Skype, например, с синхронизацией нескольких кадров), и мне нужно, чтобы данные PostMessage были заблокированы. через иерархию окон.

Скажем, я получаю строку, _wcsdup it, PostMessage (WM_NEWSTRING, ...), и элемент управления где-то в глубине иерархии обрабатывает ее, или, если нет подписчиков, сообщение очищается.

Сейчас я изучаю то, что все сообщения отправляются в поток приложения, поток находит активный фрейм или наиболее подходящий фрейм, передает ему сообщение, фрейм передает сообщение в его представление, представление передает сообщение в подпредставление и т. Д. , если нет представления для обработки сообщения, оно освобождается.

Проблема в том, что эти команды связывания довольно утомительно писать, поскольку мне приходится дублировать код пересылки сообщений в каждом имеющемся у меня классе CWnd. В то же время очистка ресурса довольно неприятна, потому что, если нет окна для приема сообщения, кто-то должен позвонить на бесплатный. Поэтому простая отправка сообщения в главный насос сообщений без дополнительной обработки в надежде, что кто-то всегда его поймает, не является правильным подходом. PostMessage возвращает S_OK, никто не видит сообщение как обрабатываемое, и оно остается висящим.

Есть ли лучший и правильный подход к тому, что я ищу?


person Coder    schedule 15.11.2010    source источник
comment
Нет никаких причин не использовать просто SendMessage, это тривиально решает проблему управления памятью. Трудно понять, почему бы вам просто не использовать вызов метода.   -  person Hans Passant    schedule 15.11.2010
comment
Несколько потоков ... SendMessage - это эффективная сериализация + переключение контекста.   -  person Coder    schedule 16.11.2010
comment
Если вы категорически настроены на использование этого метода, почему бы не добавить приемник сообщений в самый конец цепочки передачи сообщений, который очистит любое сообщение, которое дойдет до этого уровня?   -  person Jon    schedule 31.03.2011


Ответы (1)


Я бы никогда не использовал PostMessage, как вы описываете. Мое решение часто связано с рукопожатием:

// From CNotifierBlah
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0);
//
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam)
{
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter!
}

Практически то же самое, что и шаблон наблюдателя.

person l33t    schedule 26.09.2011
comment
Я прибегал к чему-то близкому, но точно не через уведомители. - person Coder; 26.09.2011