【问题标题】:Broadcasting message to multiple processes (Point-to-Point Message Queue with multiple readers)将消息广播到多个进程(具有多个阅读器的点对点消息队列)
【发布时间】:2011-04-03 14:13:32
【问题描述】:

我想与多个进程共享数据。我的第一次尝试是将Point to point message queue 与多个阅读器一起使用,因为我读到 P2P 消息队列非常快。

在我的测试过程中,似乎多个阅读器正在从同一个队列中读取,一旦一个阅读器获取了一条消息,其他阅读器将无法获取相同的消息。

对于将数据共享给多个进程的更好的 IPC 是什么? 数据更新频繁(每秒多次),所以我认为 WM_COPYDATA 不是一个好的选择,会干扰“正常”的消息队列。

我的第二次尝试可能是共享内存 + 互斥体 + 事件

【问题讨论】:

    标签: winapi windows-mobile windows-ce ipc windows-embedded


    【解决方案1】:

    点对点队列可以正常工作。是的,当您发送时,只有一个接收者会收到消息但是发送者可以查询队列(通过调用 GetMsgQueueInfo)来查看有多少个侦听器(MSGQUEUEINFO 的 wNumReaders 成员)并简单地重复该消息的次数。

    【讨论】:

    • 我实际上已经想到了这一点,但后来我不确定消息是否会被平等地传递(循环)。而且,如果其中一个阅读器线程决定暂停阅读并对收到的消息进行长时间的处理,是否会错误地将排队的消息传递给其他阅读器并导致一些阅读器多次收到相同的消息?我应该确保读者永远不会兼职,只专注于阅读信息吗?谢谢
    【解决方案2】:

    最后,多个线程或进程打开同一个队列进行读访问或写访问是完全有效的。点对点消息队列支持多读多写。例如,这种做法允许一个写入进程向多个客户端进程发送消息,或者多个写入进程向一个读取进程发送消息。但是,没有办法将消息寻址到特定的读取器进程。当一个进程或线程读取队列时,它将读取下一条可用消息。也无法将消息广播给多个读者。

    Programming Windows Embedded CE 6.0 Developer Reference,第四版,Douglas Boiling,第 304 页

    尽管有警告,但 ctacke 的 ide 似乎适合我的用例。

    警告:
    我的队列阅读器在获取他们的消息共享后需要Sleep(10),以允许其他阅读器去获取消息。如果没有Sleep(),则只有一个读取器进程发出等待信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多