佚名通过本文主要向大家介绍了请教关于葫芦的形状,关于请教的名言,关于请教大师的笑话,关于请教的成语,关于虚心请教的名言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 请教:关于COM组件中的辅助线程
描述:
以我的理解,应该转换是安全的,因为不管是否跨越套间,IA_Func1实际上都应该似是在对象创建的套间中执行的,那么传递的this指针就应该能安全的转换为组件的实现类的指针。
如果在转换后调用到了其他的接口(非CA实现的接口,而是包容或聚合的接口)的话,那么转换就是不安全的。
请教各位高手,上述结论是否成立?
如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。
在工作线程中如何才能安全的访问到CA类的辅助函数及类变量呢?
解决方案1:
描述:
// 某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实际上都应该似是在对象创建的套间中执行的,那么传递的this指针就应该能安全的转换为组件的实现类的指针。
如果在转换后调用到了其他的接口(非CA实现的接口,而是包容或聚合的接口)的话,那么转换就是不安全的。
请教各位高手,上述结论是否成立?
如果不行的话:由于IA_Func1是个很耗时的操作,所以必须开启工作线程。
在工作线程中如何才能安全的访问到CA类的辅助函数及类变量呢?
解决方案1:
只要在线程中调用的成员函数自己做线程同步就没有问题
解决方案2: 转换是可以的。传进去的this指针是对象本身的,即是一个类对象的指针,并不涉及代理存根和套间。
但是要指出的是,这么用非常危险,也很不合常理。
这么用需要注意以下几个问题:
1. 这个对象的生命周期问题,确保线程内使用时,这个对象一定存在(因为这个指针已经脱离com引用计数的管理),否则会引起调用野指针的异常。
2. 线程的管理问题,在对象生命周期结束前,确保这些新创建的线程先结束
3.线程内调用到的对象的方法,需要进行多线程同步,如果没有涉及共享资源当然也就没这个问题了。
感觉是没问题,主要要注意对相关变量的同步操作和客户端对组件的释放等