Кажется, вам нужен поток, который может обрабатывать несколько сообщений из других потоков.Другие потоки добавили бы сообщение в очередь сообщений этого потока.В таком случае вы можете использовать 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
).