class A
{
public:
int a,b;
void execute();
};class B
{
public:
CWinThread* m_pThread;
A *ObjA;
    static UINT ThreadFunction(LPVOID pParam);
B();
~B();
};
void A::execute()
{
for(int i=0;i<10000;i++)
{
a=b+1;
}

};
UINT B::ThreadFunction(LPVOID pParam)
{
B *pJQ = (B *)pParam;
while(1)
{
       pJQ->ObjA->execute();
}
}
B::B()
{
  ObjA=new A;
  m_pThread = AfxBeginThread(ThreadFunction,this);
}
B::~B()
{
   m_pThread->ExitInstance();
   delete m_pThread;
   delete ObjA;
}
我在析构B时,ExitInstance()并没有从ObjA的execute退出,造成读写错误,请问如何更正?

解决方案 »

  1.   

    在ExitInstance()中实现"等待机制",一直等到ThreadFunction线程结束后,再执行delete m_pThread;delete ObjA;等代码
      

  2.   

    可能是 while(1)死循环造成的吧,要不就是A::execute()中循环要执行10000次,有个时间延时吧
      

  3.   

    应该用这个函数去解决AfxEndThread
      

  4.   

    如前所述,前面的线程没有结束,你可以先获得该线程的活动状态(Active)再进行析构,当然最基本的是用等待函数,但这样做会消耗大量的系统运行时间和资源,你可以用信号量或同步对象。除非万不得已,不要强行终止线程,这会使系统内存发生泄漏的。
    这是我的理解,但愿对你有所帮助。
      

  5.   

    使用信号量,解决,设置信号终止.setevent()