初始化创建好A线程;
主线程结束A线程代码:
                  SetEvent(hStopTreatA);
SetEvent(hTreatA);
while(WaitForSingleObject(hHaveStopA,INFINITE)==WAIT_OBJECT_0)
{
CloseHandle(hTreatA);
CloseHandle(hStopTreatA);
CloseHandle(hHaveStopA);
}A线程结束代码:
        while (WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0)// 开始执行某些操作
{
                UINT nExitCode =0;
ResetEvent(hTreatA);
if(WaitForSingleObject(hStopTreatA,0)==WAIT_OBJECT_0)
{
              ResetEvent(hStopTreatA);
SetEvent(hHaveStopA);
AfxEndThread(nExitCode); }
        }
大部分时间都可以正常结束线程,但是偶尔会发生程序不响应。
好像加sleep可以解决,但是想知道具体原因,总觉得是while循环的问题。
请高手指点!

解决方案 »

  1.   

    sleep(0)好像是可以让出线程的当前时间片。不过可靠吗?
      

  2.   

    把WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0放到while中去
      

  3.   

    WaitForSingleObject(hStopTreatA,0);
     改成
    WaitForSingleObject(hStopTreatA,1000/18);
    另外
    while (WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0)
    毫无意义
    写成if吧为了让程序不死锁(虽然几率小),可以这样
    if(WaitForSingleObject(hStopTreatA,1000/18) == WAIT_TIMEOUT){
       TerminateThread(hThread);
    }else{
       ....
    }虽然 TerminateThread很不友好,但比死锁还是稍微强一点点.
    尽量别在线程中 new 分配内存 或 Create 一些对象.
    别用某些 C++ 函数,(具体哪些不太清楚,可参看 <Windows 高级编程>)1000/18 只是我的猜想, Windows 的事件响应和线程切换片分配总会占用时间吧,传0
    总是直接返回.
    CPU的系统时钟是18.3/秒,因此我传 1000/18