快速业务通道

COM原理及应用----COM特性

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-05-23
对象,而不是针对COM组件程序,所以在同一个COM组件中的不同对象可以运行在不同的线程类型上。

24、COM线程的使用

(1)进程内组件对象

如果一个COM对象运行在一个套间线程中,那么此COM对象与UI线程中的窗口对象有很类似的特性。COM对象属于创建此对象的套间线程所有。套间线程通过消息控制函数被自动同步,所以,运行在套间线程中的COM对象,不需要进行同步处理,但套间线程外的客户的其他线程要访问此线程只能通过代理/存根实现。

如果一个COM对象运行在一个自由线程中,那么同一进程中的其他线程(即客户线程)可以直接调用此对象成员函数,但对象成员函数必须进行同步处理,以保证其线程安全性。

(2)进程外组件对象

如果是进程外组件对象,则不管其运行在套间线程还是自由线程中,客户调用必须跨进程,因此调用始终是间接进行的,所以列集对于进程外组件对象是必须的,而列集的结果是自动实现同步的,对象成员函数可以不处理同步。

套间线程中的对象被跨线程调用时,与跨进程调用有着类似的特性。所以套间线程有自己的COM库初始化和终结过程调用。

25、列集和同步

COM对象的不同线程模型影响的主要是列集处理和同步处理。结果列集处理的调用总是通过代理和存根间接进行,因此,其效率也自然有所降低,但列集使所有对对象的调用通过消息循环中转,所以调用被自动进行同步处理,某一时刻至多只能有一个调用在进行,所以COM对象不需要进行同步处理,也就是说COM对象可以不是线程安全的(thread-safe)。反过来,不通过列集处理的调用虽然是直接进行的,效率也比较高,但某一时刻可能会有多个客户同时调用,因此,对象必须要进行同步处理,以便保证对象是线程安全的。

26、不同线程模型(客户线程与对象线程的不同组合)对列集和同步的不同要求

(1)客户和对象运行在不同的进程中。客户调用进程外组件总是要通过代理和存根,所以列集是必须的。因此,COM自动实现了调用的同步处理,对象不必进行同步处理。

(2)客户和对象运行在同一个线程中。与对象处于同一线程中的客户调用对象总是直接进行的,而且同一线程中的调用不可能冲突,所以客户调用即不需要列集,而且对象也不必进行同步处理。

(3)客户和对象运行在同一个进程中,对象运行在套间线程中,客户运行在另一个套间线程或自由线程中。因为对象运行在它自己的套间线程中,所以客户调用总需要列集处理,COM自动实现同步处理,对象不必考虑同步。COM会自动为我们实现接口指针的列集处理,我们也可以自己对接口指针进行列集处理。

(4)客户和对象运行在同一个进程中,对象运行在自由线程中,客户运行在另一个套间线程或自由线程中。当客户调用自由线程中的对象时,虽然对象被自由线程所创建,但调用实际上在客户线程中执行,所以客户对接口的调用是直接进行的,因此接口列集是不必要的,但对象必须自己处理同步,因为多个客户有可能同时调用接口成员函数。

27、套间线程

在套间线程的主函数中有一个消息循环,而且主函数必须对COM库进行初始化。COM在套间线程中创建了一个隐藏的窗口,主函数的消息循环负责接收消息并分发消息(包括客户对对象的调用的消息)。

对于运行在套间线程中的COM对象来说,因为这样的对象只能被此线程访问,其他的线程只能通过代理/存根调用接口函数,所以对象可以不必担心同步问题,但对象仍然需要保护全局变量,因为对象的成员函数被所有的同类对象所共享,因而函数有可能会重入。进程内组件DLL程序的入口在多线程环境下有可能被同时访问到,因此,这些入库函数如DllGetClassObject和 DllCanUnliadNow仍然需要进行同步处理,以保证多线程访问时不会发生冲突。进一步来讲,DLL组件程序的类厂也必须满足一定的要求,以保证多个线程同时访

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号