COM原理及应用----COM特性
问类厂对象时不会引发冲突问题,尤其当用类厂对象创建多个组件对象时,类厂必须是线程安全的,即内部提供了同步处理。使类厂线程安全只需对引用计数操作进行同步保护即可。
如果套间中的函数要把接口指针传给另一个线程,不管此线程是套间线程还是自由线程。列集和散集是必须要进行的,列集处理分两种情况:自动列集和手工列集。自动列集的情况比较简单,凡是通过COM传递的接口指针,COM都会自动列集,包括装入接口代理和存根代码等等。手工处理列集也是可能的,因为客户线程与对象线程在同一个进程中,因此,通过其他途径传递接口指针也很方便。 28、自由线程 自由线程在概念上与Win32的辅助线程完全一致。它们只有一个主函数,当主函数执行完成后,线程就自动结束。在自由线程的主函数中,必须调用 CoInitializeEx函数,而且dwCoInit参数必须指定为COINIT_MULTITHREADED,以便COM知道这是一个自由线程。自由线程中的COM对象必须是线程安全的,所有的同步工作由对象自己处理。 与套间线程类似,自由线程即可以由客户程序创建,也可以由类厂创建,但不管哪种情况,COM对象总是由自由线程的主函数来创建。 29、进程内组件的线程模型 通常进程内组件并不调用CoInitialize或者CoInitializeEx标识其对象所使用的线程模型,但是,COM需要知道进程内对象的线程模型,以便正确处理跨线程情况下接口指针的传递以及对象调用的同步处理,所以,我们要在系统注册表中指定对象的线程模型。 对于进程内组件程序,为了支持多线程的情形,不管是套间线程模型还是自由线程模型,其入口函数DllGetClassObject和DllCanUnloadNow应该是线程安全的,尤其需要对引用计数包括对象引用计数器以及锁计数器等进行同步保护。 在实际使用过程中,通常对象被客户线程所创建,因此客户线程模型与对象的线程模型有可能不一致,这种不一致性包含两种可能:支持套间线程模型的对象被自由线程所创建,则COM会生成一个套间线程来运行对象,并把列集后的接口指针传给客户线程;第二,支持自由线程的对象被套间线程所创建,则COM会生成一个自由线程来创建对象,并把接口指针经列集后(可以优化)传给套间线程。 套间线程模型的COM对象,如果用到了自定义接口,则即使是进程内组件程 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |