程序如下:我用一个全局变量StopThread来终止线程,可是有时候能终止,有时就停在WaitForSingleObject这一句不动了,为什么?volatile bool StopThread;//开始线程
CAAADlg::OnStart()
{
    StopThread = false;
    AfxBeginThread(Thread1,....);
}//终止线程
CAAADlg::OnStop()
{
    StopThread = true;
    WaitForSingleObject(....);
    
}// 线程程序:
UINT Thread1(...)
{
    While(1)
    {
       if (StopThread)  break;    }    return 0;
}

解决方案 »

  1.   

    以前有个贴子,介绍要用PeekMessage:PeekMessage(&msg,0,0,0,PM_REMOVE);
    if (WM_THREAD_EXIT == msg.message)
    {
        StopThread = true;
        WaitForSingleObject(....);
    }
    各位大虾能讲解一下吗?
    运行时提示:WM_THREAD_EXIT没有定义
      

  2.   

    /*******************************************************************************
    * 退出线程                                                                     *
    *******************************************************************************/
    DWORD m_ThreadID; //线程ID
    HANDLE         m_hThread; //线程句柄
    int ExitThread()
    {
    if (TerminateThread(m_hThread, 4))
    {
    DWORD dwExitCode =0;
        while(TRUE)
    {
    GetExitCodeThread(m_hThread, &dwExitCode);
    if (dwExitCode != STILL_ACTIVE)
    break;
    Sleep(10);
    }
    CloseHandle(m_hThread);     
    } return 0;
    }
      

  3.   

    volatile bool StopThread;
    CWinThread *pThread;void Start()
    {
    StopThread = false; pThread = AfxBeginThread(MyControllingFunction,
    NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    pThread->m_bAutoDelete = FALSE;
    VERIFY(pThread->ResumeThread() != (DWORD)-1);
    }void Stop() 
    {
    StopThread = true;
    WaitForSingleObject(pThread->m_hThread, INFINITE);
    delete pThread;
    }我的代码是这样的, 我分析可能是在某些情况下程序执行完StopThread = true后线程切换到Thread1, 并且没有来得及执行WaitForSingleObject(...), 线程就结束了运行, 而你又设置得是让框架自动删除执行完成得线程对象, 这时pThread->m_hThread取出来得就是一个垃圾值, 如果这个垃圾值是一个合法得Handle值, WaitForSingleObject(...)就可能死掉.希望我分析得是对得
      

  4.   

    to flinming(flinming): 据说微软不提倡用TerminateThread,是吗?to snooper1001(yhhv):我就是用的您的代码呀,delete的问题解决了,这个问题有没有办法呢?
      

  5.   

    怎样判断pThread->m_hThread取出的值是否是垃圾值?
      

  6.   

    如果线程不是自动删除, pThread->m_hThread取出的不应该是垃圾值, WaitForSingleObject(...)也不应该死掉的!
      

  7.   

    我将WaitForSingleObject(pThread->m_hThread, INFINITE)一句改为WaitForSingleObject(pThread->m_hThread, 5000), 可以退出并执行delete pThread
    ,但程序稍后会自动出现错误提示:
    Unhandle exception in  aaa.exe: 0x0C0000005: Access Violation。
    如果不执行delete pThread则不会出该提示,这是否说明线程并没有停掉?请继续关注。
      

  8.   

    可能是线程没有收到StopThread = true;是吗?
      

  9.   

    ExitThread是不太提倡的么?有谁知道怎么用Peekmessage给线程发消息?
      

  10.   

    用peekmessage不是很好么,简单明了。
      

  11.   

    WM_THREAD_EXIT  就是buttom的id好
    PeekMessage(&msg,0,0,0,PM_REMOVE);
    if (WM_THREAD_EXIT == msg.message)
    {
        StopThread = true;
        WaitForSingleObject(....);
    }
      

  12.   

    buttom的id好?还是不太明白,我的退出线程的button ID是IDC_Stop,能详细介绍一下吗?
      

  13.   

    如果可以的话, 把你的代码给我发一份看看([email protected]).
      

  14.   

    好好的检查一下循环中的代码, 看有没有死锁? 例如线程在等待某个信号, 而这个信号只有在线程结束时才产生等.
    Unhandle exception in  aaa.exe: 0x0C0000005: Access Violation
    能够说明线程没有停掉.