本帖最后由 Soyokaze 于 2010-07-28 23:47:51 编辑

解决方案 »

  1.   

    GetExitCodeThread() 将传回线程函数的返回值,然而GetExitCodeThread() 的一个
    糟糕行为是,当线程还在进行,尚未有所谓的结束代码时,它会传回TRUE表示成功,如果
    这样, lpExitCode 指向的内存区域中应该放的时STILL_ACTIVE,你必须小心这种行为
    ,也就是说你不可能从其返回值中知道"到底是线程还在运行呢,还是它已经结束,但返回
    值为 STILL_ACTIVE"==================这是侯捷翻译的
      

  2.   

    GetExitCodeThread() 的返回值应该是 TRUE 或者 FALSE, 尽管 BOOL 实际上是 typedef int BOOL,  即 GetExitCodeThread() 的返回值只表示该函数本身执行是否成功并不是说对应线程如果结束了GetExitCodeThread() 函数就必须返回其结束代码,线程是否结束与该函数的返回值根本就是两码事,GetExitCodeThread() 函数返回 FALSE 的唯一情况应该是它无法确定其检测线程的状态.而候捷这里却以其返回值来判断被检测线程是否结束,并说GetExitCodeThread() 的返回值是一种" 糟糕的行为" ,这很没道理,该函数设计的目的就是获取一个线程结束时的返回值,本来就不是用来检测一个线程是否结束,当然如果能够保证线程不将 STILL_ACTIVE  作为错误码返回也可以用来检测线程是否结束
    ============================这是网上说的
      

  3.   

    WaitForSingleObject(hThread, 0);
    If dwMilliseconds is zero, the function tests the object's state and returns immediately
    所以用WaitForSingleObject(hThread, INFINITE);
      

  4.   

    WaitForSingleObject(hThread, INFINITE);//等待知道线程退出
      

  5.   

    GetExitCodeThread返回值为0不一定是错误,可用GetLastError来判断,应该是你线程的返回值,你可以把它改为非0试一下.详情参见MSDN.WaitForSingleObject可以用来等待你线程在退出时设定发出的信号,但直接这样用好像不行.
      

  6.   

    WaitForSingleObject(hThread, 0);
    -->
    WaitForSingleObject(hThread, INFINITE);
      

  7.   

    WaitForSingleObject(hThread, INFINITE);
      

  8.   

    我想的是零等待判断线程是否结束,而不是死等。
    其实可以用一个事件来实现,线程退出时设置事件为有信号,就可以判断已经退出了。
    但是我想的是用 WaitForSingleObject()这种直接的方法。
    按照MSDN文档,本来是可以的,但是出现了0楼所述的问题,这贴的目的是问这个的。
      

  9.   

    觉得不妨在WaitForSingleObject第二个参数稍微加一个数字试试
      

  10.   

    你判断线程结束的方法用的是GetExitCodeThread,通过它的返回值来判断的,但是MSDN上对GetExitCodeThread的返回值的说法是:
    Return Values
    If the function succeeds, the return value is nonzero.If the function fails, the return value is zero
    GetExitCodeThread返回0只是说明这个函数调用失败,并不是说线程已经退出了。
    用GetExitCodeThread(HANDLE hThread,  LPDWORD lpExitCode)
    判断线程状态是看它的第二个参数 lpExitCode是不是STILL_ACTIVE吧。
      

  11.   

    我程序里是用WaitForSingleObject()判断的,而不是GetExitCodeThread()。
    之所以提到了后者,是WaitForSingleObject()出现错误后,用来证明线程确实已经退出了的。
    现在不明白是WaitForSingleObject()本身的Bug,还是我程序的问题。
    具体是这样的:
    3个线程A、X、Y
    A是常驻线程,一直在运行
    X负责和用户的交互,有一个窗口
    当A发现用户交互请求时,启动X
    X和用户交互完毕后,反过来把用户的选择通知A(通过PostThreadMessage),然后结束
    针对不同的用户选择,某些情况下需要Y来完成响应。所以对于这些选择,A再启动Y
    在Y执行过程中,用户仍可以和X交互来选择中止Y
    所以当用户提出交互要求时,A需要判断X是否运行,否的话再建立X
    -------------------------
    问题就出在A判断X上,当X没有运行(不是挂起,是退出)Y运行时,不论怎么调用
    WaitForSingleObject(hThread, 0);
    返回的都是WAIT_TIMEOUT(应该是WAIT_OBJECT_0);
    而Y没有运行时,返回的正常。