今天热门
热点:

:关于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组建,其套间模型与创建对象的线程模型一致。

www.zrccd.nettrue/topics/20180116/67800.htmlTechArticle:关于COM组件中的辅助线程,com组件辅助线程 // 某COM组件CA实现了IA接口。IA接口有一个函数IA_Func1,CA的实现如下:class CA{//... void CA_Method1();private:long m_nValue;};HRESULT CA::IA_Func1(){CreateTh...

相关文章

    暂无相关文章

用户评论

大家都在看