佚名通过本文主要向大家介绍了com组件,com组件是什么,com组件下载,com组件注册,com组件编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: [有两个关于COM组件同步的问题]
描述:
pCA->pIB->IB_Method1();这一行代码有问题吗?我传给工作线程的参数是IA实现组件CA类的this指针。
还有个问题就是,如果在threadProc中有可能修改到CA类的类变量,而这些类变量也有可能在IA的接口函数里被访问,那么在修改的时候是否需要加锁?
另外还有一个问题,在此一起请教:
一个COM组件(名为HD)需要通过串口控制一个硬件设备,所有的控制操作均需要通过串口指令进行。
因为串口只能打开一次,所以该COM组件一旦有一个实例调用了打开串口的指令,其它的实例就不能再打开串口了。这也就意味着只能有一个HD的实例能操作硬件,不能两个实例并行控制。
现在有这么个需求,需要在Web页面A里通过HD对硬件进行一些操作,同时在Web页面B里也要通过HD对该硬件进行一些操作,应该怎么设计?
解决方案1:
描述:
CA组件(Apartment)实现了IA接口,同时CA内部创建了一个CB组件,CB组件实现了IB接口,该接口指针保存在CA组件的IB *pIB类变量中。
/*CA.h 头文件*/
IB *pIB;//包容的IC接口
UINT m_nValue;//类变量
static DWORD WINAPI threadProc(LPVOID);//工作线程
/*CA.cpp 实现*/
STDMETHOD CA::IA_Method1()
{
m_nValue = 1;//这里要加Lock吗?
}
STDMETHOD CA::IA_Method2()
{
CreateThread(NULL,0,threadProc,this,0,NULL);
return S_OK;
}
DWORD CA::threadProc(LPVOID pVoid)
{
CA *pCA = (CA*)pVoid;
pCA->pIB->Method1();//这里能直接调用pIC的函数吗?
pCA->m_nValue = 2;//这里要加Lock吗?
return 0;
}
pCA->pIB->IB_Method1();这一行代码有问题吗?我传给工作线程的参数是IA实现组件CA类的this指针。
还有个问题就是,如果在threadProc中有可能修改到CA类的类变量,而这些类变量也有可能在IA的接口函数里被访问,那么在修改的时候是否需要加锁?
另外还有一个问题,在此一起请教:
一个COM组件(名为HD)需要通过串口控制一个硬件设备,所有的控制操作均需要通过串口指令进行。
因为串口只能打开一次,所以该COM组件一旦有一个实例调用了打开串口的指令,其它的实例就不能再打开串口了。这也就意味着只能有一个HD的实例能操作硬件,不能两个实例并行控制。
现在有这么个需求,需要在Web页面A里通过HD对硬件进行一些操作,同时在Web页面B里也要通过HD对该硬件进行一些操作,应该怎么设计?
解决方案1:
要么移到外面,做成进程外组件..各个页面都与它通信...这样就只有一个实例
解决方案2: 第二个问题,把组件HD设计成SINGLETON模式。在组件实现类定义里加一个下面的语句:
DECLARE_CLASSFACTORY_SINGLETON(HD)
pCA->pIB->Method1(); // 绝对不能这样调用
pCA->m_nValue = 2; // 如果只是改变一个简单的值,就需要进行同步,选定一种同步方式,封装一个方法来设置,例如:
void CA::SetValue(UINT nValue)
{
Lock();
m_nValue = nValue;
Unlock();
}
读取变量的函数也得加锁。
这样搞其实搞复杂了,最好还是列集一下指针,在工作线程中获得的代理指针可以访问任何属性和方法,而且无需同步。