描述:
按照书上说单线程套间模型的COM对象只能在自己的套间里执行,
但是我用ATL自己写了一个单线程套间的对象,在我的测试程序里面我从主线程通过COM库函数CreateInstance创建它,
然后,开了一个Work thread,把指针传给它,然后在它里面竟然调用成功了,并没有返回书上所说的那个什么WRONG_THREAD的错误!在这个线程里面我甚至都没有调用COM库的初始化函数!
这是怎么回事?希望高手解答!同时能把套间的概念解释清除最好了,但请不要用书本上的话,因为我怀疑那些写书的人自己可能都不懂套间的概念呢~~呵呵
下面是我的接口,贴上主要代码,我在辅助线程里面调用的就是test函数
class ITest : public IUnknown
{
public:
// ... 省略部分无关代码
// ~~~~ 在辅助线程里面调用的它
virtual HRESULT __stdcall test()
{
// 弹个框框~~
MessageBox(NULL,"hey!","",0);
};
}
解决方案1:
针对你的情况
结论:在辅线程中创建对象成功是可能的,但运行出错是必然的(不是指程序崩溃,而是逻辑错误)
举例类似出错情况:
就像多线程访问同一个全局变量,而没有加任何保护一样,安全吗?
COM套间的目的就是:处理并发问题
下面简单解释:
1.简单来讲:
套间:主要为了同步对组件的调用(内部有个消息循环),没什么复杂的
稍微详细一点:
STA中只有一个线程可以执行,意味着驻留在STA中的对象永远也不可能被并发访问,只有一个特定的线程可以执行对象上的方法,所以对象的实现者可以安全地把多个方法调用用之间地中间状态保存在TLS(线程局部存储)中
2.接口指针列集(为什么要列集)
简单来讲:
接口指针只是变换成可被传输的字节流,字节流的唯一内容标志了对象和它所拥有的套间
详细一点:
COM在你列集过程中,会”隐式“产生代理和存根()
在你的辅线程里,真正交互是,你与代理---存根与组件(可惜这里不能贴图,否则很容易明白了)
所有这些操作最主要的目的就是:主线程和辅线程 对组件对象的操作都在同一个套间(可以理解为:向同一个消息队列中发消息)里,最终目的只是处理并发
3.下面是一些总结:
套间总结:
(1)组件为 STA
I客户地套间为STA,组件直接生活在客户的STA中,效率最高
II客户的套间为MTA,进程内激活对象迫使COM在另一个套间(默认STA)中激活对象,然后返回给客户一个代理
(2)组件为MTA
I客户的套间为STA,那么类对象(以及后续的实例)将在COM创建的STA中执行
II如果客户的套间为MTA,类对象将在MTA中执行