我线程的流程是:
UINT CMyClass::ThreadProc(LPVOID pParam)
{
    CMyClass* myclass = (CMyClass*) pParam;
    while( !(myclass->m_bStop)) //true)
    {
       ........//My work
    }
    return 0;
}void MyClass::StartThread()
{
   CWinThread* pThread = AfxBeginThread(ThreadProc, this);
   if (pThread!=NULL)
   {
       m_hThread = pThread->m_hThread;
       m_bStop = false;
   }
}void MyClass::EndThread()
{
//终止线程
   m_bStop = true;
   WaitForSingleObject(m_hThread, INFINITE)
}
我在MyProjectAPP中调用EndThread(),我单步执行,程序一旦跳到这个函数中,好像整个程序都死了,线程卡在一个地方退不出来了,waitforsingleobject无限等待。为什么?哪会出问题呢?

解决方案 »

  1.   

    检查一下你的CMyClass是不是全局变量,或者是在堆中生成的.要是在栈中生成的或是局部变量就会有问题,或者你将线程函数命名为全局的如:UINT  ThreadProc(LPVOID pParam),另外:你在线程之间传递MFC对象指针,是不安全的。
      

  2.   

    检查一下你的
    {
           ........//My work
     }
    的代码例外可以在执行m_bStop = true
    时在while( !(myclass->m_bStop)) //true)设置断点,
    跟踪,看是否执行了;(可以在m_bStop = true之后加一条语句,在这条语句也设置断点)
      

  3.   

    实际上你的线程函数参数为:
    UINT CMyClass::ThreadProc(CMyClass *p, LPVOID pParam)加上static就可以了
    static UINT CMyClass::ThreadProc(LPVOID pParam)
      

  4.   

    将线程函数改为UINT ThreadProc(LPVOID pParam)即可,我在我的机器上已调试通过
      

  5.   

    我试过把它改为全局变量,也不行。我单步执行,只要一到WaitForSingleObject程序就死了,无法跳到线程里的断点,就好像线程被挂起一样,why?why?why?
      

  6.   

    在叫
       CWinThread* pThread = AfxBeginThread(ThreadProc, this);
    之前
       m_bStop是何值?????查查吧!
      

  7.   

    首先,ThreadProc(LPVOID pParam)应该是static的,
         static UINT ThreadProc(LPVOID pParam);
    其次,
         m_bStop 应该是volatile的
    volatile bool m_bStop;
      

  8.   

    建议你对程序做如下修改:
    线程函数声明为static,亦即:
    staitc UINT CMyClass::ThreadProc(LPVOID pParam)在StartThread中,把m_bStop放在AfxBeginThread之前:
    void MyClass::StartThread()
    {
       m_bStop = false;
       m_hThread = NULL;
       CWinThread* pThread = AfxBeginThread(ThreadProc, this);
       if (pThread!=NULL)
       {
           m_hThread = pThread->m_hThread;
       }
       else
       {
           m_bStop = true;
       }
    }void MyClass::EndThread()
    {
    //终止线程
       m_bStop = true;
       WaitForSingleObject(m_hThread, INFINITE)
    }不知道是否能解决你的问题,祝好运!
      

  9.   

    您可以在ThreadProc结束前,打印一条信息,
    以便确认是否退出。TRACE0("ThreadProc End\n");
    return 0;
      

  10.   

    另外,您需要在StartThread中,把 m_bStop=false提前,m_bStop=false;// !!!!!
    CWinThread* pThread = AfxBeginThread(ThreadProc, this);
      

  11.   

    对不起,我前面的代码写得不全,我的ThreadProc是static UINT型,而且
    m_bStop = false;也确实上AfxBeginThread前面。我的线程工作正常,可就是结束不了,线程运行时,m_bStop一直是false.但是我听从iicup的建议加了
    TRACE0("ThreadProc End\n");并在这一句前设了断点
    return 0;
    但是程序没有停在这里就死了,很明显,线程没有结束。我的主线程有一个窗口,当窗口接受到WM_KEYDOWN消息后,主线程就调用CMyClass::EndThread(),这样做难道不合理么?
    我一按键,马上就跳到主线程中了,线程就好像被挂起来了,why?why?why?
      

  12.   

    建议把 m_bStop 定义为易变型变量:BOOL volatile m_bStop;
      

  13.   

    我发现当窗口响应我的WM_KEYDOWN消息,并消息响应中调用到我的MyProjectApp::KillAllThreads()中,在这个函数里,我没走几步,我CMyClass中的线程就已经死在while(!m_bStop)内的一个函数上,我不知道为什么,因为这个线程在工作时一直是正常的。最后,我在KillAllThreads()函数内第一行写
    m_MyClass.m_bStop = TRUE;后,线程就能正常结束了,放在其他位置不行,我不知道为什么,跟线程的时间片有关系么?
    你如果知道为什么,能不能告诉我,e_mail:[email protected]
    我先把分分给大家,谢谢
      

  14.   

    建议拿掉那句
    WaitForSingleOjbect();
    试试。
    按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。
      

  15.   

    建议拿掉那句
    WaitForSingleOjbect();
    试试。
    按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。
      

  16.   

    建议拿掉那句
    WaitForSingleOjbect();
    试试。
    按我的理解,这个函数是阻塞的,而且在你的的代码中,没有必要在ENDTHREAD()等线程返回。