九com多线程模型内容摘要:

3 STA和 MTA 7  进程 ,套间 ,线程 ,COM对象示意图 线程 线程 对象 线程 对象 对象 对象 对象 对象 MTA STA 线程 对象 对象 对象 STA 线程 不使用 COM的其他的对象和线程 进程 8 4 客户的套间  客户进程创建套间的方法。 客户调用 CreateProcess或 CreateThread, 操作系统会创建一个线程。 新创建的线程没有与它相关联的套间。 在使用 COM之前,新线程必须调用下列三个 API函数之一,以便进入套间: HRESULT CoInitializeEx(void *pvReserved, DWORD dwFlags)。 HRESULT CoInitialize(void *pvReserved)。 HRESULT OleInitialize(void *pvReserved)。 pvReserved被保留必须为 0。 CoInitializeEx是最底层的 API, 它运行调用线程进入哪种类型的套间。 指定 COINIT_MULTITHREADED标志将进入 MTA。 9  HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED)。  进程中第一次调用此函数的线程将创建一个 MTA, 它在退出之前如果再次调用,将不起作用。 其他线程如果调用此函数,将加入此 MTA中。 进程中所有要加入 MTA的线程都在此 MTA中。 要退出的线程调用 void CoUninitialize(void)。  线程要新建并进入 STA, 它应调用 HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED)。 此套间为此线程所私有,其他线程无法加入。 同样,它若再次调用将不起作用。 而 CoUninitialize(void)。 将使它退出套间。  CoInitialize(0)等价于 CoInitializeEx(0, COINIT_APARTMENTTHREADED)。 HRESULT OleInitialize(void *pvReserved)。 则用于支持 OLE的情形。  CoUninitialize(0)退出原来的套间。 10 5 对象的套间  对象所处套间的决定方式  以上主要讨论的是客户的套间。 但是对象所处的套间并不是由客户所决定的。 1. 从原理上:对象只把自己的接口方法暴露给客户,并不会把所有的一切都暴露出来。 对象的并发性特性可能与客户所希望的并不一致。 2. 从实现上:对象可能根本与客户不在同一个进程甚至同一台台机器上 . 3. 无论以上那种情况 , 对象都驻留在一个不同于客户的套间中 .而客户会接收到一个指向代理( Proxy) 的指针。 (参见 COM的跨进程特性 ) 代理也是一个 COM对象。 代理等价与另一个套间中的某个对象。 代理与它所代表的对象暴露了同样的一组接口,然而代理在实现这些接口时,只是把调用传递。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。