请问:
问题1: 在非模式对话框的类中 OnInitDialog()成员函数中,创建了一个线程,之后我想在关闭该非模式对话框窗体时,关闭线程。在重写的OnCancel()虚函数中添加了如下代码:
LPDWORD  lpExitCode;
GetExitCodeThread(hThread3,lpExitCode);
TerminateThread(hThread3,(DWORD)lpExitCode);可是结果是窗体销毁了,线程依然还在运行。  怎样关闭该线程?

解决方案 »

  1.   

    设置一个事件,然后WaitForSingeObject无限等下去,等到线程安全退出后,才销毁对话框
      

  2.   

    最好弄一个事件来同步你的线程.
    在线程函数里等待你这个事件变量为已通知状态之后就return。
      

  3.   

    首先看看你的线程函数hThread3是否初始化了,把它初始化为NULL.
    在对话框构造函数中添加 hThread3 = NULL; 这句.其次,楼主确定你的非模态对话框已经销毁了吗?非模态对话框按OK/Cancel只是隐藏,不是销毁。对话框类重载 PostNcDestroy 虚函数,在 CDialog::PostNcDestroy(); 这句代码之下添加 delete this;像这样:
    void CXXXDlg::PostNcDestroy()
    {
       // TODO: 在此添加专用代码和/或调用基类
        CDialog::PostNcDestroy();
        delete this; //一定添加到这里
    }
    再次,线程是在OnDestroy()而不是OnCancel()中销毁的。把你的代码写在OnDestroy()中。最后,把OnCancel()中的OnCancel();这句代码注释掉,并添加DestroyWindow();的调用!void CxxxDlg::OnBnClickedCancel()
    {
        // TODO: 在此添加控件通知处理程序代码
         DestroyWindow();
        //OnCancel();
    }
      

  4.   

    最好是线程返回自动关闭,强制关闭线程的话容易出问题,
    要不你就设置一个event,通知event关闭线程再销毁对话框
      

  5.   

    你怎么创建的线程?线程中做了什么事儿?建议你暂时先不要用TerminateThread···
      

  6.   


    创建线程最好用AfxBeginThread
    hThread3 = AfxBeginThread(...)在OnDestroy()中销毁
    //结束线程
    if( hThread3 != NULL )
    {
    if(::WaitForSingleObject(hThread3->m_hThread, 3000) == WAIT_OBJECT_0)
    {
    delete hThread3;
    hThread3 = NULL;
    }
    else
    {
                      ::TerminateThread(hThread3->m_hThread,0); //强制结束线程
    }
    }