我做了一个程序,是在连接设备的时候模拟一个进度条,显示加载的进度,告诉用户程序还活着。void CConnectDlg::OnBnClickedOk()//按OK后进行连接
{
      //.....省略代码
      CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CProgressThread));//这个就是一个进度条线程
      m_strWaitInfo.Format(_T("正在连接....")); //这个是进度条信息
      try
      {
             xxxx->connect();//连接
             m_strWaitInfo.Format(_T("连接成功...."));//显示连接成功
             //怎么关掉pThread
      }
      catch(System::Exception ^e)
      {
            m_ConnStatusMsg = (CString) e->Message;
            m_strWaitInfo = m_ConnStatusMsg; //显示报错信息
               //怎么关掉pThread
      }
}现在我的问题是,连接成功后活着报异常后怎么安全关掉这个pThread线程,不要出现内存泄露等危险情况啊?大侠们,帮忙撒!

解决方案 »

  1.   

    CProgressThread类的run里面加个标记flag  要关闭的时候设置这个标记 然后run里面就return  
      

  2.   

    run函数不是直接 return CWinThread::Run();还有我设置了flag怎么传给CProgressThread啊?
      

  3.   

    用主线程,发消息给你的UI线程类,关闭进度条窗口
    ::PostMessage(pThread->pLoadingDlg->m_hWnd,WM_CLOSE,0,0);
    然后再退出UI线程
             HANDLE hThread=pThread->m_hThread;         pThread->PostThreadMessage(WM_QUIT,0,0);
    while(WaitForSingleObject(hThread,200)==WAIT_TIMEOUT)
    {
       pThread->PostThreadMessage(WM_QUIT,0,0);
    }
      

  4.   


    返回的CWinThread *pThread 不就是你的CProgressThread对象指针啊 你直接强转直接加接口或者成员变量都行啊  或者用5楼的 给线程发消息
      

  5.   

    你是指直接调用pThread ->ExitInstance()?这样是不行的,关键是我现在怎么都触发不了ExitInstance,还有,貌似ExitInstance执行完以后才return嘛!
      

  6.   


    你只要保证run函数退出了   线程就执行完了  所以在你想要退出的地方让run return就行了 
      

  7.   

    把你CProgressThread的run代码发出来
      

  8.   


    你先把窗口关闭了,就可以执行CProgressThread::ExitInstance了.
      

  9.   


    那你就先把线程类的窗口关闭,
    在调用pThread->PostThreadMessage(WM_QUIT,0,0);
    让线程退出.2楼的方法也是不错的.