现在的位置: 首页 > 综合 > 正文

Wince上的进程通信

2013年04月08日 ⁄ 综合 ⁄ 共 1639字 ⁄ 字号 评论关闭

公司一直以来喜欢招应届生,历来的招聘程序中都有这样一个环节:就是根据面试情况,给一首开放的题目给面试者带回去做。其实能把东西基本做出来,我基本上都会给offer。绝大部分题目很简单,上网查查就做得出来了,不过也许题目简单,很多人不屑于做。其实这一环节,只不过是考察下是否真有心想加入公司和态度问题。

     这是其中一道:用三种以上方法实现wince上进程间的通信。

     进程间交互信息,有很多方式。基本上课本都会教管道、信号量、消息队列、共享内存、套接字了,当然,那些什么注册表、数据库、磁盘文件的方式不算了。

    1.消息队列  

消息队列应该是比较常见的实现方法,大部分MFC初学者估计都会用这一种方法,即是利用SendMessage/PostMessage来进行WM_USER 的发送。只要实现一个自定义消息的消息映射即可方便地接收和处理消息,如果发送数据块则可用WM_COPYDATA来实现。不过,这种方法如果用来实现两个进程实时双向通信显得怪模怪样。发送方必须得到接收方的窗口句柄,如果是发给没有消息循环机制的应用程序,或者发给不带窗口的程序(如服务程序),则变得极度麻烦了。

2.套接字

socket通信,这是编写极方便的一种方法,直接使用封装好的CCesocket类就能使用,不过了,如果不仔细看看和理解使用注释,也会出很多阻塞、内存泄露之类的问题。不过个人认为,如果使用socket的方法来进行单纯的本地的两个进程的通信,未免有点杀鸡用牛刀的味道,因为尽管socket通信表面上看来速度很够,也是有很多公司会这么用的,但socket毕竟是一个很大的包,通信时通过一层又一层。

   3.共享内存

   直接的内存共享的方法,旧版本的wince好像支持,不过现在wince较高的版本5.0 6.0是不支持直接的内存共享的,即一个进程里申请的空间,在另一个进程里是无法访问的,每个进程运行在各自独立的进程空间里,申请的空间无法共享。有人会这么做:划出一块物理内存,然后把这块物理内存作为公共的内存,映射到各进程的虚拟内存里,然后结合Event等内核对象来进行通信。这是一件多么让人心里没底的事情。哪天出什么怪问题了,我看都会来怀疑这里了。

   Wince里提供了一种内核对象用于进程间通信的,叫file-mapping 对象。其可以共享巨大的内存空间,结果event/mutex等的使用即可方便安全地进行进程间的通信,双方只要知道这个内核对象叫什么名字就行了。这种方法,所谓内存映射文件(这种文件不是放在磁盘的那种文件),其实质也是共享内存,只不过它们共享的内存不是在进程空间里的内存,而是位于放应用层进程运行空间底下的一层。如下图:

        

    其实SendMessage的方法的深层实现也是这个原理,只不过MFC为我们封装得很好了,很多人根本没有想是怎么实现的。

     

     4.管道通信

     其实wince里没有什么所谓的管道通信,但是msdn介绍了一种点对点消息队列的方法,其工作原理与管道通信非常相似。在单向IPC通讯时,一个进程创建用于写入的队列,另一个进程创建用于读取的队列。在双向IPC通讯时,需要在通讯的每一端分别创建一个读队列和一个写队列。具体方法,在网上很容易找到相关的资料,用熟了,它也一个非常好的方法。其实现的实质也跟前面介绍的大同小异,只不过这个是别人封装得比较好的了。

     一直以来,都没有写技术博客的习惯,所做编程笔记也是零零散散,现在时间充裕点了希望慢慢把以前的东西,包括Opengles 、MediaPlaye、 Wince/windows 、单片机 、GPRS 、蓝牙编程 、Ipod编程、C++/C#编程基础等做些总结,读来不知所云也好,浅薄无知也好,技术积累总要有那么一个过程。

原文地址  http://blog.mcuol.com/User/basicygp/Article/46800_1.htm

抱歉!评论已关闭.