WaitForSingleObject(m_hThread,INFINITE);这句话,我只知道是处于阻塞模式来等待线程m_hThread结束。我写了若干个程序,都用到了这句话,有的成功了,有的就停住不动了。当然,这几个程序不完全一样。我现在思路就有些混乱,不知道为什么那个成功而这个不行。感觉上虽然在这儿阻塞住了,但是只要m_hThread结束,仍然可以返回并继续执行的嘛。看了网上的一些文章,有人说可能是因为执行这一句话之前m_hThread就已经结束了,于是我进行Debug跟踪,发现没有这个问题。我在SetEvent或者标记置位之后,仍然可以一步一步执行线程的退出。直到线程return 0语句执行之后,然后僵在一个.c文件的_endthreadex语句处了……反正感觉挺奇怪的。谁帮忙解释解释?什么情况下能用WaitForSingleObject,什么情况下不能用?谢谢。

解决方案 »

  1.   

    “有的成功了,有的就停住不动了”
    看了楼主这句话,感觉楼主理解的“成功”就是不阻塞。其实WaitFor……系列函数在执行是有两种可能性,如果参数句柄已经激发(比如线程已经结束),则直接返回,否则根据第二个参数指定的时间阻塞等待句柄被激发。
      

  2.   

    你可以这样试验一下:把WaitFor……的第二个参数设置为一个具体的超时,比如1000。然后看它的返回值是不是Timeout还是别的什么错。
      

  3.   

    有可能是核心对象没有释放,或者给DELETE掉了
      

  4.   

    >>>>
    回复: 你可以这样试验一下:把WaitFor……的第二个参数设置为一个具体的超时,比如1000。然后看它的返回值是不是Timeout还是别的什么错。
    返回值是258,也就是WAIT_TIMEOUT...
      

  5.   

    而且,我等待1秒钟之后,返回WAIT_TIMEOUT,再试图用TerminateThread去结束线程也没有用了。似乎线程处在一个不完全结束的状态……WaitFor的一秒钟之内,线程函数UINT WINAPI _ThreadProc(LPVOID pParam)执行完了return 0; 但是又没有返回给WaitFor函数,在其它地方僵住了。
      

  6.   

    如果用INFINITE的话,最后跟踪的结果,似乎是阻塞在这一句上了:threadex.c文件中,_endthreadex函数的最后一句:ExitThread(retcode);怎么回事?
      

  7.   

    一般的多线程编程模型是这样的:
    主线程在退出前(比如主窗口的OnDestroy)要通知所有的其他工作线程(worker thread)正常退出,比如设置全局标志变量,这样工作线程在下一个循环中可以通过判断这个变量来得知主线程要退出了,它自己也应该return。
    主线程通知完所有的工作线程后,要wait,以等待工作线程正常退出。如果wait超时说明工作线程可能已经失去响应(写得好的程序一般不会发生)直接Terminate完事。
      

  8.   

    楼主请参考msdn关于wait...的帮助