:关于COM组件中的辅助线程,com组件辅助线程
// 某COM组件CA实现了IA接口。IA接口有一个函数IA_Func1,CA的实现如下: class CA { //... void CA_Method1(); private: long m_nValue; }; HRESULT CA::IA_Func1() { CreateThread(NULL,0,threadProc,this,0,NULL); return S_OK; } unsigned long CA::threadProc(LPVOID param) { CA *pCA = (CA*)param; //这个转换不确定是否能成功(STA、MTA、DCOM远程组件) pCA->CA_Method1(); //由于上面的不确定,这里也不确定是否能成功调用 InterlockedIncreament(&pCA->m_nValue); //同上 return 0; }
// threadProc只会调用CA类实现的函数或API函数,不会调用到其他接口;
// 这样能在各种客户端套间环境(STA/MTA/BOTH/None)下正确运行吗? // CA的ThreadingModal对上述问题的答案有影响吗? // 困扰很久了,一直无法确定答案。 // 如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。 // 在工作线程中如何才能安全的访问到CA类的辅助函数及类变量呢?
MaRs``
解决方案
1 Single套间模型的COM组建,只在进程中第一个被创建的STA线程中实例化。其他线程需要通过代理发送消息到该线程的消息循环中,调用唯一实例。 | ||||||||||||||
2 STA套间内COM对象的裸指针不能够直接传递给其他线程使用。需要进行列集处理。 | ||||||||||||||
3 在STA线程中创建MTA套间模型的COM组建,或者在MTA线程中创建STA套间模型的COM组建,COM会从线程池中分配与组建类型相同的线程,用来运行组建。 线程池中的STA线程具有消息循环,并要求指针调用强制序列化(保证裸指针被其他线程失败)。自定义的线程如不经特殊处理不具备强制序列化的功能。 |
||||||||||||||
4 Both模型的COM组建,其套间模型与创建对象的线程模型一致。 |
用户评论