今天调试程序,遇到一个很费解的问题,现在做个记录:

   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对象后再调用,就可以解决问题。

 

后记:后来再看到一本书,明确指出类的构造函数里不应调用虚函数,否则会出现不确定的问题。在以上问题里,就是类似的犯了这个错误,所以是不正确的。