消息队列(MsgQueue P2P)
(本节内容适用于WinCE.net 4.0及以上版本)
消息队列通信机制如同建立了一个管道,管道的双方通过分别建立到管道的两端,与管道的读端口建立连接的进 程可以从该端口读取消息(Message),与管道的写端口建立连接的进程可以写 入消息(Message)到管道。管道内消息组成了一个FIFO(First In First Out)的队列,从读端口读取消息是读取队列的头,写入消息 到写端口是在队列尾部追加一个消息。
WinCE中关于MsgQueue的 操作函数主要有:
◇ CreateMsgQueue()创建一个消息队列。在该函数的参数中指定消息队列的名 字,消息队列的最大数目,每个消息的最大长度,对该消息队列可进行读还是写操作等。因为调用一次CreateMsgQueue函 数,只能指定读或者写这样的二选一的消息队列,所以一般需要用相同的消息队列名字做参数两次调用该函数,分别创建读消息队列和写消息队 列,它们的返回值分别被读进程和写进程用OpenMsgQueue()打开用于读 取消息和写入消息。
◇ OpenMsgQueue()打开消息队列并建立与相应端口的连接。进程与读端口建 立连接之后,可用返回的句柄从消息队列中读取消息;进程与写端口建立连接之后,可用返回的句柄写入消息到消息队列中。
◇ CloseMsgQueue()断开与消息队列相应的端口之间的连接,并关闭由CreateMsgQueue()或OpenMsgQueue()创 建或打开的消息队列。
◇ ReadMsgQueue()如同从普通文件中读取数据一样,用于从消息队列中读取 消息。可以指定读取消息时,如果消息队列为空,读进程是被挂起还是直接返回。
◇ WriteMsgQueue()如同写数据到普通文件中一样,用于写消息到消息队列 中。可以指定写入消息时,如果消息队列已满,写进程是被挂起还是直接返回。
下图是MsgQueue应用的典型场景。
图五、用消息队列(MsgQueue)实现同步
这种场景下的执行过程为:
◇ 主进程MainProcess创建了名为“Reader/Writer MsgQueue”的读和写的消息队列,并分别返回hMsgQ_r_m和hMsgQ_w_m[序 列1-4]。
◇读进程ReaderProcess以 主进程的ProcessId和hMsgQ_r_m为 参数,通过OpenMsgQueue()与MainProcess消 息队列的读端口建立连接[序列5&6]。
◇ ReaderProcess与消息队列建立连接之后,用WaitForSingleOnject(hMsg_r)看 消息队列中是否有消息,因为此时消息队列为空,所以ReaderProcess被 挂起[序列7]。
◇写进程WriterProcess以 主进程的ProcessId和hMsgQ_w_m为 参数,通过OpenMsgQueue()与MainProcess消 息队列的写端口建立连接[序列8&9]。
◇ WriterProcess与消息队列建立连接之后,用WaitForSingleOnject(hMsg_w)看 消息队列中消息是否满,因为此时消息队列为空,未满,所以WriterProcess不 会被挂起[序列10&11]。
◇ WriterProcess写消息到消息队列中[序列12&13]。
◇ 因为消息队列中已 经有了消息,ReaderProcess从挂起状态被唤醒[序列14]。
◇ ReaderProcess继续执行,从消息队列中读取WriterProcess刚 才写入的消息。
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余1页未读,立即下载