关于内存映射的进程间通信,我直接一篇博客已经详细介绍过,这里只是再次补充一个传输图像的应用,因为OpenCV中Mat格式较为常用(并且也很方便传输),刚好用到,就做个笔记好了。应用的场景是B进程中的Mat传给A进程,A进程接受并恢复为Mat格式。其它也没什么好说的,有细节为题就参见我之前的博客,那么开始吧。

进程A创建映射空间

HANDLE d_hMutex是一个时间的句柄用于进程同步,d_hFileMapping是内存映射的句柄,LPTSTR d_pMsg是映射内存的地址指针

进程B打开映射空间

这里应该也是可以用OpenEvent的,但是我调的时候OpenEvent在A中总是无法触发,很纠结不知道为什么,算了,就CreateEvent好了,如果你知道原因,请下方留言告知博主,谢谢。

进程B发送图像

传送数据有三部分组成,一部分是帧头,另一部分是图像数据,还有一部分是电源数据,当然,我们只需要关注两部分,一个是帧头,定义了有多少图像,每幅图像的大小通道和指针偏移,第二部分是数据,指针转换直接往内存映射区填就可以了。点云部分时博主自己的,可以忽略。

这里强调下,在传输图像数据时,模式cv::Mat的图像数据是continue的,如果你接受到的数据有断行或者其他问题,那么也就是说图像数据在内存中可能不是连续的(需要通过Mat.isContinue()来判断),那么你把它拷贝一遍就连续了(深拷贝)。然后直接把数据的Mat.data指针放上来,拷贝到映射内存区,拷贝完激活一个事件,告诉A进程要接受数据了。

进程A接受图像

进程A在WaitForSingleObject的地方阻塞等待,在B激活事件后,A就从WaitForSingleObject这里往后执行,然后打开内存映射区域,解析数据包,然后往cv::Mat里填就可以了。

进程A销毁资源

放在OnDestroy或者析构函数中,在退出时销毁。

进程B销毁资源

也是一样

OK,See You Next Chapter!

发表评论

电子邮件地址不会被公开。 必填项已用*标注