Рабочий поток не имеет цикла сообщений (MFC, Windows). Можем ли мы сделать это для получения сообщений? - PullRequest
1 голос
/ 12 июля 2011

Mfc обеспечивает рабочий поток и поток пользовательского интерфейса.Пользовательский интерфейс включен с возможностью получения сообщений (отправка, публикация).Можно ли позволить рабочему потоку тоже получать сообщения.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Повторно звоните CWinThread::PumpMessage(), пока не вернется сообщение WM_QUIT.

1 голос
/ 14 июля 2011

Кажется, вам нужен поток, который может обрабатывать несколько сообщений из других потоков.Другие потоки добавили бы сообщение в очередь сообщений этого потока.В таком случае вы можете использовать PeekMessage для запуска цикла, который в конечном итоге создаст скрытое окно, а затем использовать GetMessage для получения сообщений.Другие потоки будут использовать PostThreadMessage с идентификатором потока (который имеет Peek / GetMessage) и код сообщения, LPARAM, WPARAM.

Это будет выглядеть (не синтаксически правильно):

TheProcessor()
{
    MSG msg;
    PeekMessage(&msg,...);

    while(GetMessage(&msg...)
    {    /* switch case here */ }
}

Потоки будут вызывать PostThreadMessage - Для получения дополнительной информации см. MSDN.Когда вам нужно отправить больше данных, чем может вместить LPARAM / WPARAM, вам, в конечном счете, нужно выделить их в куче, а затем удалить ПОСЛЕ обработки после обработки сообщения в пользовательском цикле сообщений.Это было бы громоздко и глючно.

Но ... Я бы посоветовал вам иметь свой собственный класс, помимо std::queue/deque или другого DS, где вы можете добавить AddMessage / PushMessage и PopMessage (или любые другие именатебе нравится).Вам нужно использовать SetEvent, WaitForSingleObject для запуска нового сообщения в цикле (см. Одну из реализаций здесь . Вы можете сделать его универсальным для одного типа данных или сделать его шаблоном класса - этобудет поддерживать любой тип данных (ваш базовый DS (queue) будет использовать тот же тип данных). Вам также не нужно беспокоиться о кучах и удалениях. Это менее подвержено ошибкам. Возможно, вам придется решать проблемы с MT.

Использование событий Windows включает в себя переход режима ядра (поскольку события называются / объекты ядра), и вы можете использовать условные переменные, которые являются объектами пользователя. Или вы можете сразу использовать класс unbounded_buffer из Concurrency Runtime Libraryдоступно в VC10. См. эту статью (перейти к unbounded_buffer).

0 голосов
/ 12 июля 2011

Да, вы можете создать очередь сообщений в рабочем потоке.Вам нужно будет запустить рассылку сообщений в этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...