В моем приложении MFC у меня есть рабочий поток, который прослушивает сетевое подключение, и как только появится какая-то информация, я звоню SendMessageToDescendants
, чтобы отправить эту информацию через параметр lparam. Поэтому каждое окно кадра получает сообщение и, возможно, обрабатывает его через обработчик сообщений для сообщения WM_SYNCHRONOTIFICATION
(WM_SYNCHRONOTIFICATION
- это сообщение WM_APP+x
).Использование SendMessageToDescendants между потоками
Код рабочего потока: (упрощены для краткости)
while (TRUE)
{
CNotificationMessage notificationmessage;
Listen(¬ificationmessage); // blocking until some information arrives
m_pMainWnd->SendMessageToDescendants(WM_SYNCHRONOTIFICATION, NULL, (LPARAM)(newnotif));
// have all OnSynchroNotification handlers been called here ?
}
Обработчик сообщений в основном потоке:
LRESULT CMyFrame::OnSynchroNotification(WPARAM p1, LPARAM p2)
{
CNotificationMessage *pNotification = (CNotificationMessage*)p2;
// process message (ommited for brevity)
}
код работает отлично, но я не конечно, если по возвращении с SendMessageToDescendants
все вызвали OnSynchroNotification
.
[Никогда не используйте различные SendMessage из потока] (http://stackoverflow.com/a/29603742/17034). –