首 页       用户登录  |  用户注册
设为首页
加入收藏
联系我们
按字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
按声母检索 A B C D E F G H J K L M N O P Q R S T W X Y Z 数字 符号
您的位置: 5VAR论文频道论文中心计算机论文计算机网络
   COM服务器的伪异步技术及其实现      ★★★ 【字体: 】  
COM服务器的伪异步技术及其实现
收集整理:佚名    来源:本站整理  时间:2009-01-10 10:07:59   点击数:[]    

tionPoint接口,并通过它建立与服务器的连接。
4)      定位成功,则由客户端实现这个出接口,这里的接口实现也即接收器(Sink)。
5)      客户程序通过IConnectionPoint::Advise()方法将一个指向接收器的一个出接口指针传递给服务器。连接被建立。
6)      COM服务器收到调用请求,创建新线程,并由新线程通过这个收到的出接口指针进行回调(callback)操作,将通知或消息反馈到接收器,从而完成一次异步调用。
这是一种非常常规的方法,为客户程序提供了一个标准的方法来实现这些接口,而且MFC(微软基本类库)和ATL(活动模板类库)都对连接点技术提供了很好的支持,使用方便。当然也能在服务器组件中直接使用出接口,从而省去出于标准化目的而对出接口进行的封装。这样的好处是服务器组件直观、高效,可以减少额外的开销,但是它不能为客户程序提供一个标准的方法来实现出接口,所以建议只在服务器和客户端配合开发,双方均了解出接口,且接口较为简单的情况下使用。
3.2 MTA中的COM服务器
如果COM服务器组件处在一个多线程单元(MTA)里面的,要实现异步回调非常容易,只要新生成的线程通过CoInitializeEx(0,COINT_MULTITHREAD)也加入了同一个MTA,那么COM服务器就可以简单地将接收器传入的出接口指针传递给这个新线程,新线程可以使用这个指针直接进行回调操作。原因很简单,出接口的指针传递并没有跨单元。如果新生成的线程通过CoInitialize (0)创建了一个新的STA,我们也可以作同样处理。在此情况下,跨单元的接口指针传递的确需要进行调度,但是COM相当聪明,在此情况下它能自动完成指针的调度。当然了,调度必然影响组件的效率,不管我们是手动调度或者是COM进行的自动调度。在服务器的开发中引入MTA,通常是为了追求高效率,提供组件对并行性的支持。相应的,必须对服务器对象的成员函数进行同步处理,保证多个线程调用不会发生冲突,也就是说服务器组件必须是在各方面都是线程安全的,全局数据也必须要受到保护。
3.3 STA中的COM服务器
COM服务器组件如果被建立在一个单线程单元(STA)里面的,情况就不同了,因为STA中只存在一个线程, 要实现异步回调,必然要涉及到出接口指针的跨单元使用。通常有两种解决方案:
    (1)由COM服务器组件把出接口指针调度到新的线程中去,这个过程在通常情况下是由服务器组件的开发人员手工进行调度, COM提供了两个标准的函数,服务器组件使用函数                                CoMarshallInterThreadInterfaceInStream(IID_ICallBack,m_pCallBack,&pStream)     将出接口指针调度到一个流(stream)中去,而在需要执行回调的新线程里使用COM所提供的CoGetInterfaceAndReleaseStream(pStream, IID_ICallBack, (void **)&pCallBack)函数将流里的出接口指针pCallBack取出来。通过这个调度过程,COM为指针在两端建立了代理和存根,我们就可以在新线程里直接使用这个指针进行回调操作了。这是一个普遍的用法, 但是指针的调度是一个开销很大的过程,所以它的效率不高。
(2)我们还可以采用另外一种替代方法:新线程向服务器所在线程发送的窗口消息,由COM服务器组件实现回调函数(使用出接口指针)来响应这个消息。这个过程主要是利用消息循环,让STA中的窗口过程保证调用到COM对象相应的回调函数中去, 新线程可以避免对出接口指针的直接操作。由于避免了指针的跨单元传递,我们就可以节省跨单元调度所需要的开销,效率非常高。在很多时候这甚至是唯一的方法,在ATL(活动模板库)中使用连接点技术非常方便,因为ATL通过连接点向导为回调提供了一个连接代理,对回调过程进行了很好的封装。但是出接口指针被完全封装到了触发(fire)函数中,要跨单元传递出接口指针就非常困难,所以通过消息来触发回调就成了最好的选择。但是应强调一点,STA里线程必须要实现自己的消息循环机制,能够分发消息,否则对STA中组件方法的任何调用都将被挂起(hang)。所以用MFC来实现一个存在于STA中的COM服务器是一个很坏的选择,因为MFC中STA的线程(类似于工作线程)是不具有消息循环的。
采用STA开发COM服务器虽然复杂,但优点明显。STA中的单元线程拥有隐藏的窗口,所有对此线程中服务器组件方法的调用都被COM转化为消息(message),由窗口过程保证调用到COM对象的成员函数中。由于消息总按照一定顺序执行,所以不需要进行同步处理,这也是STA模型的最大优点----由COM来处理多数线程同步方面的细节问题。如果并不太关心并行性,而更看重组件的功能,那么就可以引入单线程单元(STA)来设计服务器组件。

4.      结论
要实现一个伪异步工作的COM服务器,必须对连接点技术和COM线程模型进行合理的组合使用,尤其线程模型的选择更是我们实现高效COM服务器的关键。此外,作者个人推荐使用ATL来开发这样一个服务器组件,因为它灵活,高效,对COM的各项技术均提供了极好的支持,尤其在对COM线程模型的支持方面,是MFC所不能比拟的。


[参考文献]
[1]Tom Armstrong 等 (著),董梁 等(译), ATL开发指南[M]  ,北京:电子工业出版社
[2]潘爱民,COM原理与应用[M] ,  北京:清华大学出版社
[3]Martin Gudgin(著)宋亚男(译),IDL精髓[M] ,  北京:中国电力出版社
[4]MSDN(2001),Eight Lessons from the COM School of Hard Knocks[C]
[6]MSDN(2001)/Q15077,Descriptions and Workings of OLE Threading Models[C]

上一页  [1] [2] 


Tags:


文章转载请注明来源于:5VAR论文频道 http://paper.5var.com。本站内容整理自互联网,如有问题或合作请Email至:support@5var.com
或联系QQ37750965
提供人:佚名
  • 上一篇文章:获取远程主机MAC地址的新思路及实现

  • 下一篇文章:使用JAVA编写网络通信程序
  • 返回上一页】【打 印】【关闭窗口
    中查找“COM服务器的伪异步技术及其实现”更多相关内容 5VAR论文频道
    中查找“COM服务器的伪异步技术及其实现”更多相关内容 5VAR论文频道
    最新热点 最新推荐 相关新闻
  • ››Internet时代的网络出版
  • ››惩治网络犯罪推进电子商务发展
  • ››Win2003服务器RPL远程启动服务的安...
  • ››网络营销与个人隐私保护
  • ››网络与未来出版
  • ››强化网站项目管理的需求分析
  • ››试谈计算机网络安全关键问题的分析...
  • ››浅论气象业务建设中网络故障与及时...
  • ››浅谈人防指挥计算机网络的安全性
  • ››计算机网络故障管理智能化研究
  • ››COM服务器的伪异步技术及其实现
  •   文章-网友评论:(评论内容只代表网友观点,与本站立场无关!)
    关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图
    Copyright © 2006-2033 5Var.Com. All Rights Reserved .