//下面三步可以正常停止句柄为hThrd的线程?
(1)GetExitCodeThread(hThrd,&m); //线程外部执行
(2)::ExitThread(m); //线程内部执行
//等待线程的退出
(3)WaitForSingleObject(mVoiceManager.hThrd,INFINITE); 

解决方案 »

  1.   

    (1)GetExitCodeThread(hThrd,&m); //线程外部执行
    这个是得到线程退出的代码,如果线程没结束,m得到的值是STILL_ALIVE(2) 可以结束线程,但是资源可能并没有释放掉(3)无限等待线程对象为Signal状态,挂起当前线程,如果等待的线程结束,WaitFor函数返回
      

  2.   

    线程的生命期
     1.用CreateThread函数建立新线程 并返回新线程句柄 HANDLE hNewTh;
     2.新线程开始处理,线程结束时 调用ExitThread函数. 以上两步就是线程的基本过程,如果建立线程后,有两种结束情况需要注意
      1. 需要知道线程的退出代码,则一般用
          WaitForSingleObject(mVoiceManager.hThrd,INFINITE);  等待线程结束,并调用
         GetExitCodeThread(hThrd,&m) 获取线程退出代码.
      2.线程在程序存在期间一直运行,比如socket通信程序,要在主程序结束时通知 线程结束
      并用函数WaitForSingleObject(mVoiceManager.hThrd,INFINITE); 等待 不管那种情况结束,线程结束后,要关闭线程句柄 CloseHandle(hNewTh);
      

  3.   

    线程正常退出 == 线程正常结束确认线程里没有死循环,并在进程结束前WaitForSingleObject以确保线程正常结束。
      

  4.   

    不要用::ExitThread(m); 退出线程,这样会使你的C/C++资源(如C++类对象)不会被销毁,最好是让线程函数返回来结束线程
      

  5.   

    DWORD WINAPI WritePGNThread(LPVOID lpvoid)
    {
           BOOL ThreadStatus = true;
       
       while (hPort != INVALID_HANDLE_VALUE) 
       {    
       if(DriverID.IsEmpty())
       {
       Sleep(500);
       }else
       {
       com4.PushCommand(CDataDoPacket::Packet_LoginHeartbeat(DriverID));    Sleep(60000);
       }
       }
     
           return 0;
    }
      

  6.   

    //等待线程的退出
    (3)WaitForSingleObject(mVoiceManager.hThrd,INFINITE); 
      

  7.   

    在你认为线程函数应该结束的地方直接return,就OK了,比什么都安全
      

  8.   

    线程内部正常关闭return  
    正常关闭CloseThread
    强制关闭TerminateThread
      

  9.   

    设置一个变量 表示退出if (e)
      return ;比如就这样 要结束的时候改变e 就退出了
      

  10.   

    //等待线程的退出
    (3)WaitForSingleObject(mVoiceManager.hThrd,INFINITE);