Как создать более чистую сеть PostMessage в WinApi / MFC - PullRequest
1 голос
/ 15 ноября 2010

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

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

Что я сейчас изучаю, так это то, что все сообщения публикуются в потоке приложения, поток находит активный кадр или наиболее подходящий кадр, передает ему сообщение, кадр передает сообщение.по его мнению, представление передает сообщение в подпредставление и так далее, если нет представления для обработки сообщения, оно получает free'd.

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

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

1 Ответ

1 голос
/ 26 сентября 2011

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

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

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

...