今天调试程序,遇到一个很费解的问题,现在做个记录:
class CS3Adapter : public CBaseAdapter
类CS3Adapter继承于CBaseAdapter,其中
CBaseAdapter::CBaseAdapter(void)
{
DWORD ThreadID = 0;
HANDLE hThread = 0;
hThread = StartControlThread(&ThreadID);
if (hThread)
{
m_hControlThread = hThread;
m_ControlThreadID = ThreadID;
}
}
CBaseAdapter::~CBaseAdapter(void)
{
StopControlThread(m_hControlThread,m_ControlThreadID);
}
DWORD ControlThread(LPVOID pData) {
CBaseAdapter *p=(CBaseAdapter*)pData;
if (p)
{
p->on_control_thread();
}
return 0;
}
HANDLE CBaseAdapter::StartControlThread( DWORD *pThreadID )
{
BOOL fRet = FALSE;
HANDLE hThread = NULL;
DWORD ThreadID = 0;
hThread=::CreateThread(NULL,0,ControlThread, this,0, &ThreadID );
if ( NULL!=hThread ){
if ( pThreadID ) *pThreadID = ThreadID;
}
return hThread;
}
void CBaseAdapter::on_control_thread()
{
}
其中CBaseAdapter::on_control_thread()是虚函数,在CS3Adapter中有定义void CS3Adapter::on_control_thread(),现在的情况是,new CS3Adapter,程序进入不了CS3Adapter::on_control_thread()(这个程序运行在WINCE设备上,在某些机子或模拟器上可以进入,但在我的调试机上不能进),经过追踪,发现可能是由于在构造函数中启动线程,会由于对象还没完全构造完毕(估计原因,真正是不是还待再确认),从而p->on_control_thread()得不到正确的地址。
将构造函数中的语句另外放到一个共用函数中,new对象后再调用,就可以解决问题。
后记:后来再看到一本书,明确指出类的构造函数里不应调用虚函数,否则会出现不确定的问题。在以上问题里,就是类似的犯了这个错误,所以是不正确的。