进程间通信

1. 命名内存映射对象

使用命名内存映射对象,两个进程能够分配一块共享内存,同时两个进程都是可以平等访问的。你必须使用命名内存映射对象,这样两个进程才能够访问到同一块数据。系统能够为该对象的使用维持合适的计数,知道所偶打开它进程都关闭,才释放对象。

这个级别的交互是有代价的。在他们读写共享内存块的数据时,你需要进程间同步。

CreateFileMapping()创建内存映射对象

MapViewofFile()为该对象创建一个试图。

当映射对象使用完毕,通过下面函数关闭试图:

UnmapViewoffile()关闭视图。

2.点对点消息队列

为了和消息队列通信,一个或者一对进程创建一个读队列和一个写队列。

调用创建函数或者打开队列函数,只能指定它是读还是写,不能同时拥有读写权限。该队列接着被再次打开以进行相应的读写操作。通过向队列句柄调用写函数,“消息”被写入队列中。(这种情况下,一条消息是一个简单的定长数据块)。消息能够通过对队列句柄调用读函数来读出。如果一系列消息被写入到队列中,他们读出的顺序和被写入的顺序相同,是经典的先入先出(FIFO)。当一个队列被创建时,消息的最大个数和每条消息的最大长度被定义。如果队列已经填满,这是执行写操作,写函数将被阻塞,或者说立刻返回失败,或者是在返回失败前等待一段时间。同样的,读函数也会被阻塞,直到队列中有新的未读消息,或者在返回失败前等待一段时间。

一条消息可以被标记为一条“警告”消息。警告 消息被送往队列的最前,这样下一次读操作能够读到这条警告消息,而不管队列中还有多少未读消息。同一时刻,同一个队列中只能传送一条警告消息。如果在第一条警告消息读取之前,发送了第二条警告消息,第二条警告消息将取代第一条,第一条就丢掉了。

创建消息队列

CreatemsgQueue();该函数返回的句柄是一个事件句柄,可以使用WaitForSingleObject函数或者其他相关等待函数来等待。当队列状态改变时,这个事件被置为信号态,队列中放入一条信息或者队列中的一个记录变为可用,都可以改变队列状态。

在已经有相同名称的队列存在时,Createmsgqueue()也能执行成功。getlasterror返回ERROR_ALREADY_EXISTS。

一个已经创建的队列使用以下函数打开:OpenMsgQueue();

向队列写入一条消息:WriteMsgQueue();

从队列中读取消息,ReadMsgQueue();

查询消息队列的配置:GetMsgQueueInfo();

关闭消息队列:CloseMsgQueue();由于队列必须至少被打开两次,一次读一次写,该函数对每个队列必须调用两次。

但是对于长的大数据量的队列,最好还是使用内存映射对象来动态分配内存,只是用消息队列来传递指向这些大数据缓冲的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值