呃,安全退出是在线程里调用AfxEndThread或者在外部通知线程来调用
至于你的问题嘛,很明显是代码有bug,就算你写了AfxEndThread估计也是执行不到就退出的。
话说回来你这三行的结果就是AfxBeginThread的默认行为,你哪里抄来的多此一举的代码?

解决方案 »

  1.   

    MFC的UI线程是肯定没有问题的.  问题肯定是出在你自己写的代码导致的UI线程崩溃.
      

  2.   

    修改了一下,伪代码如下,不知道还有没什么问题:主窗口OnInitDialog中创建界面
    pCurverThread = AfxBeginThread(RUNTIME_CLASS(CUICurveThread));
    界面线程CUICurveThread中OnInitDialog中创建工作者线程
    m_InsertThread_handle = ::CreateThread(NULL, 0, InsertDataThreadProc, this, NULL, &dwordID);
    ::CloseHandle(m_InsertThread_handle);DWORD CDlg_XXX::InsertDataThreadProc(LPVOID lpParameter)
    {
    CDlg_XXX * pThis = (CDlg_XXX *)lpParameter;
    while ((!pThis->m_bQuit)) //OnDestroy中改变m_bQuit条件状态,变量控制线程安全退出,WaitForSingleObject等待这个线程退出后再继续后面
    {
    ........
    Sleep(500);
    }
    return 0;
    }
    m_InsertThread_handle为类的成员变量,用于界面线程CUICurveThread中窗口退出
    void CDlg_XXX::OnDestroy()
    {
    CDlg_Common::OnDestroy();
    m_bQuit = TRUE;
    DWORD dwRet = WaitForSingleObject(m_InsertThread_handle, INFINITE);
    if (dwRet == WAIT_OBJECT_0)
    {
    LOG("insertdata thread quit success");
    }
    }主窗口关闭时,界面线程中的窗口会收到OnDestroy消息,然后将条件状态改变让工作者线程退出,直到工作者线程安全退出。
      

  3.   

    全局变量 bool g_running = true;
    在CXXXApp的InitInstance函数中这里创建线程 CMFCDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();窗口已经关闭了,这里 g_running = false;
    WaitForSingleObject(m_InsertThread_handle, INFINITE);
      

  4.   

    线程间同步建议用CEvent来标识一个请求,布尔量不是线程安全的。
    m_InsertThread_handle在启动的时候都已经被你关了,怎么还在关闭的时候等?
    不会写线程的话,直接用PPL就好了嘛
      

  5.   

    就算WaitForSingleObject之后再closehandle,就算用事件通知线程退出,我现在要的是怎么判断线程已经退出了,然后继续后面的操作。WaitForSingleObject等待线程句柄会卡死,GetExitCodeThread总是259(可线程已经退出)。我用了一个事件在线程结束改变状态,用WaitForSingleObject等待这个个状态,发现有时也有问题。
      

  6.   

    Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspxhttp://bbs.csdn.net/topics/390787357