《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 基于CAR构件的用户自定义事件机制的研究

基于CAR构件的用户自定义事件机制的研究

2008-07-09
作者:叶 蓉1,2,陈 榕1

    摘 要: 提出一种基于CAR构件的用户自定义事件" title="用户自定义事件">用户自定义事件机制。该机制是一种适用于嵌入式系统的、用户自定义的、实现客户与构件间交互通信的计算机运行环境的事件管理机制及装置。该机制可自动生成构件,生成构件具有升级独立性、构件互操作的简单快速性、接口重用性、构件本地/远程透明化、编程语言无关性等特性。该机制屏蔽了客户程序调用构件对象过程中繁琐的细节,大大简化了客户程序的实现。
    关键词: CAR构件  用户自定义事件  回调

 

    现有的构件技术中客户与构件之间的通信过程多为单向;客户创建构件对象,然后客户调用对象所提供的接口函数,在这样的交互过程中,客户总是主动的,而构件对象则处于被动状态。对于一个全面的交互过程,这样的单向通信往往不能满足实际需要。
    微软提供的可连接对象技术可实现构件对客户的调用。但该技术需要用户去实现客户程序与构件对象的连接、事件的激发、接收器的编写等;而且只能以接口为单位注册,即不能为接口中每个成员函数分别注册。另外,Windows应用程序" title="应用程序">应用程序都必须有一个消息循环以处理消息队列中Windows发送过来的消息。这样每个应用程序都有一个等待消息的线程,当同时运行的程序较多时,占用系统资源比较大。
    COM技术主要解决的问题:不同来源的构件实现互操作,构件升级不影响其他构件、独立于编程语言,构件在进程内、跨进程甚至跨网络运行的透明度。但调用COM构件对象的过程相当繁琐,不易操作。
    本文提出一种基于CAR构件的用户自定义事件机制, 该机制能够实现构件端和客户端" title="客户端">客户端的交互操作,跨平台的构件开发、运行环境和构件库;其通过在操作系统上自动生成中间件(代理构件),提供构件定位、调用、管理、中间件启动生成、构件通信的进程内、跨进程、跨网功能;并保证软件互操作性、版本升级独立性,具有运行环境透明性、软件协同开发、软件容错、可靠性、软件复用、软件升级的能力;具有构件升级的独立性、简单快速的构件互操作、接口重用、本地/远程透明性、编程语言无关性的特性。该机制还可自动实现标准接口类封装层,屏蔽调用COM构件对象过程的繁琐细节,从而简化客户程序的实现。
    基于CAR构件的用户自定义事件机制,其技术实现包括设置事件管理方(EventManager)、事件发送方(EventDispatcher)两个方面,两者通过接口建立关联,其具体实施过程如图1所示。该机制包括事件管理方——客户端以及事件发送方——构件端。其中连接点对象记录了包含已注册事件处理函数指针" title="函数指针">函数指针的接收器的接口指针。其实施过程包括:(1)注册事件时保存IDispatch接口指针到连接点对象中;(2)注册事件时把标识该连接的dwCookie保存到EventHandler中;(3)激发事件时,利用所保存的IDispatch接口指针调用其Invoke方法;(4)利用EventHandler所保存的dwCookie注销事件。

 

 

    事件发送方组织不同参数构成可连接对象事件,可连接对象事件具有接口,用户自定义事件函数接口注册。具体地,事件发送方在可连接对象事件内设置事件标识,事件管理方创建接收器,将事件函数指针打包设置在事件管理方的接收器内。接收器具有接口,通过注册与可连接对象端连接,把可连接对象接口指针写入对应的接收器内,并把包含事件处理函数指针的接收器所提供的接口指针设置在对应的可连接对象内。在条件符合时,事件发送方激发事件,通过接收器接口,事件管理方回调" title="回调">回调函数,并解包,执行程序。事件管理方的接收器通过接口寻找事件标识,获得该事件连接点对象的连接接口指针。其中事件处理函数参数中的第一个参数包括该事件接口的类的智能指针,用于标识事件的发送者;第二个及其后的参数与构件定义中的事件参数定义相同。接口包括普通接口和事件接口。其中普通接口为入接口,用于向客户端提供服务;事件接口为出接口,用于事件发生时回调客户端所注册的事件处理函数。对象通过事件接口与客户进行通信,而每一个接口有惟一的标识符,构件若需添加新的功能,必须先定义新的接口描述。当激发事件时,系统将按照处理函数的注册顺序调用各个事件处理函数。
    另外,对于已注册事件,在不需要该事件时可进行注销事件处理,取消该可连接对象事件对应的事件处理函数的连接。具体为可连接对象内取消接收器接口指针,接收器对象被删除(它所保存的事件处理函数指针和可连接对象指针也就没了)。
    为实现一对多或多对一的情况,事件发送方内设置一个以上可连接对象事件,每个事件对应一个可连接对象;事件管理方内可创建一个以上接收器。
    为将同一个事件处理函数注册到不同对象的事件中,事件管理方接收器可与一个以上的可连接对象建立关系;事件发送方可连接对象可与一个以上事件管理方接收器建立关系。可将同一个事件对应的多个事件处理函数注册,也就是一个事件可对应多个事件处理函数,用于分别执行同一事件的不同注册请求。
    为更好地管理可连接对象状态,可连接对象设置有重载处理,用于作为可连接对象处于可调用状态的“开或关”,管理可连接对象是否能够被调用。
    在事件管理方第一次注册某可连接对象时,调用重载处理,也就是将可连接对象的调用状态设置为“开”;在事件管理方最后一次注销可连接对象时,调用重载处理,将可连接对象的调用状态设置为“关”;没有重载处理时,执行空操作。其中,可连接对象设置连接计数器,用于统计该可连接对象所建立连接的数量,每注册一次,计数器加1;注销一次,计数器减1。当计数器数量为零时,调用重载处理,将可连接对象的调用状态设置为“关”。
    事件发送方内设有接口指针容器,用于存储可连接对象事件的描述信息以及接口指针。事件管理方内的接收器注册时,通过接口指针容器寻找所需要的可连接对象事件。这样具体的寻找方式为枚举方式,逐一寻找事件标识,再连接指针将具体事件对应的事件标识传入,获得该事件连接点对象的连接接口指针。
    事件管理方设有与应用程序连接的管理接口,用于接收应用程序的调用,应用程序通过该接口把事件处理函数的指针传入事件管理方,事件管理方再去注册该事件处理函数。因为事件管理方的注册、回调等代码是自动生成的,所以需要这个接口与应用程序交互。
    事件发送方分发事件,事件管理方实现事件处理函数指针的保存、与原对象端的连接、回调函数的过程,两者通过接口建立通信。其中建立通信应包括用户自定义的接口注册,具体步骤如图2所示;根据注册信息进行事件激发的步骤,具体步骤如图3所示;用于注销事件处理函数的注销步骤,具体步骤如图4所示。

 

 

 

 

    如图2所示,机制的客户注册事件处理函数将完成以下操作:
    步骤1:获得事件管理方接口指针;
    步骤2:通过事件管理方接口创建接收器对象(EventHandler),保存事件处理函数的指针到该对象中;
    步骤3:利用源对象提供的连接点容器接口中的寻找连接指针函数,找到与该事件对应的连接点对象;
    步骤4:通过连接点对象提供的连接点指针接口中的Advise函数,把事件接收器提供的管理方接口注册到源对象端;
    步骤5:注册时获得标识该连接的dwCookie,保存到接收器对象中。
    如图3所示,构件激发事件将完成以下操作:
    步骤1:枚举与该事件对应的连接点对象中的每个连接;
    步骤2:把事件的参数打包,并对每个连接调用其IDispatch接口中的Invoke函数,以激发事件;
    步骤3:接收器对象把传过来的Invoke的参数解包,并通过其保存的函数指针调用事件处理函数。
    如图4所示,客户注销事件处理函数将完成以下操作:
    步骤1:通过事件处理函数的指针和事件的EID(Event ID 事件标识)找到对应的接收器对象;
    步骤2:获得接收器对象保存的标识该连接的dwCookie;
    步骤3:利用源对象提供的IConnectionPointContainer接口中的FindConnectionPoint函数,找到与该事件对应的连接点对象;

    步骤4:通过连接点对象提供的IConnectionPoint接口中的Unadvise函数,传入dwCookie作参数,注销事件处理器提供的IDispatch接口;
    步骤5:释放接收器对象。
    基于CAR构件的用户自定义事件机制实现了跨平台的构件开发和运行环境,该机制安全可靠,容错性好,并且小型高效。
该机制可运用于嵌入式操作系统图形系统,操作系统只在有事件发生时回调用户程序的事件处理函数,不需要消息循环。用户进程可以没有线程,操作系统在有事件发生时,再启动线程执行事件处理函数,从而大大提高了操作系统的效率。Elastos的图形系统即采用该机制。
    该机制还可用于嵌入式系统的驱动程序。用户程序或操作系统把事件处理函数注册到用事件机制编写的设备驱动程序构件中。当有硬件中断时,驱动程序直接回调用户程序或操作系统的事件处理函数。这样就可以省去用线程定期查询设备状态的资源,也使程序编写变得更简单。
参考文献
[1] Koretide.Elastos2.0Manual.http://www.koretide.com.cn/download/download.php?id=2,2006.
[2] PAN A.COM′s Principle and COM′s Application.The Tsinghua Press,1999.
[3] ROGERSON D.Inside COM:Microsoft′s Component Object Model.Microsoft Press,1999.
[4] ECKEL B.Thinking in C++(Second Edition).Prentice Hall,2002.
[5] Koretide.CAR′s Manual[M],2006.
[6] Koretide.Website[EB/OL].http://www.koretide.com.cn
[7] 陈榕,刘艺平.技术报告:基于构件、中间件的因特网操作系统及跨操作系统的构件、中间件运行平台(863课题技术鉴定文件),2003.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。