Передача сообщений нескольким процессам (Очередь сообщений «точка-точка» с несколькими читателями) - PullRequest
1 голос
/ 25 августа 2010

Я хочу поделиться данными с несколькими процессами.Моя первая попытка - использовать Очередь двухточечных сообщений с несколькими читателями, так как я прочитал, что P2P Msg Queue очень быстрая.

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

Какой IPC лучше для обмена данными между несколькими процессами?Данные часто обновляются (несколько раз в секунду), поэтому я думаю, что WM_COPYDATA не является хорошим выбором и будет мешать «нормальной» очереди сообщений.

Моя вторая попытка, вероятно, будет общей памятью + мьютекс + события

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Очередь точка-точка будет работать нормально. Да, при отправке только один получатель получит сообщение , но отправитель может запросить очередь (вызвав GetMsgQueueInfo ), чтобы узнать, сколько слушателей (член wNumReaders в ) MSGQUEUEINFO ) есть и просто повторите это сообщение столько раз.

0 голосов
/ 30 августа 2010

Наконец, вполне допустимо, чтобы несколько потоков или процессов открывали одну и ту же очередь для доступа на чтение или на запись.Очередь сообщений точка-точка поддерживает несколько читателей и несколько писателей.Эта практика позволяет, например, одному процессу записи отправлять сообщения нескольким клиентским процессам или нескольким процессам записи, чтобы отправлять сообщения одному процессу чтения.Однако нет способа отправить сообщение конкретному процессу чтения.Когда процесс или поток читает очередь, он читает следующее доступное сообщение.Также невозможно передать сообщение нескольким читателям.

Программирование Справочник разработчика по Windows Embedded CE 6.0, четвертое издание, Douglas Boiling, Страница 304

Несмотря на предупреждение, идеал ctacke подходит для моих случаев использования.

Предупреждение:
Мои читатели очереди должны Sleep(10) после того, как они извлекут свою долю сообщения, чтобы позволить другимчитатели, чтобы пойти и получить сообщения.Без Sleep() только один процесс считывателя сигнализируется о ожидании.

...