线程结束,GetExitCodeThread后结束值一直STILL_ACTIVE,259的问题

Posted konglongdanfo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程结束,GetExitCodeThread后结束值一直STILL_ACTIVE,259的问题相关的知识,希望对你有一定的参考价值。

最近在用VC++编写一个视觉检测系统,其中开的线程比较多。知道线程什么时候结束是很重要的一个问题。其中用到了GetExitCodeThread()函数。函数原型如下:

   BOOL   GetExitCodeThread (
   HANDLE         hThread,
   LPDWORD      lpExitCode
   );
  

其中,hThread,表示要查看的线程的句柄,lpExitCode是一个DWORD类型的指针,该指针是调用函数时传递进去以保存线程状态的。如果值未STILL_ACTIVE则表示线程未结束。
这个函数的返回值,和线程的状态没有任何关系。只是表示该函数是否执行成功;
我再使用该函数的时候遇到一个问题,线程已经结束了。我能确定线程里面有个循环,还循环已经不在执行了。但是用该函数获得的状态码一直是STILL_ACTIVE,实际上在编译器里面看的时候是259,转换成16进制就是STILL_ACTIVE。代码如下:

if ( m_pThreadVelocity )
    {
        DWORD dwExitCode = 0;
        do
        {
            GetExitCodeThread(m_pThreadVelocity->m_hThread, &dwExitCode);
        }
        while( STILL_ACTIVE == dwExitCode );
        m_pThreadVelocity = NULL;
    }
    m_pThreadVelocity = AfxBeginThread(fnVelocityAndMeterThread, &m_VelocityAndMeterThreadParam, THREAD_PRIORITY_TIME_CRITICAL);

一直不知道怎么解决,后来一次偶然的机会再GetExitCodeThread函数之前先把,dwExitCode初始化了一下,就变正常了。代码如下:

if ( m_pThreadVelocity )
    {
        DWORD dwExitCode = 0;
        do
        {
            dwExitCode = 0;
            GetExitCodeThread(m_pThreadVelocity->m_hThread, &dwExitCode);
        }
        while( STILL_ACTIVE == dwExitCode );
        m_pThreadVelocity = NULL;
    }
    m_pThreadVelocity = AfxBeginThread(fnVelocityAndMeterThread, &m_VelocityAndMeterThreadParam, THREAD_PRIORITY_TIME_CRITICAL);
}

现在还不知道具体什么原因,可能是该函数内部给 lpExitCode赋值的时候不是简单的直接赋值。STILL_ACTIVE的值是一个((DWORD )0x00000103L) ,DWORD实际是unsigned char。STILL_ACTIVE的值实际上是16进制的。转化成10进制就是259。这里可能lpExitCode赋值不是简单的lpExitCode = xx之类的。所以每次执行完GetExitCode后需要重新初始化lpExitCode的值吧。

以上是关于线程结束,GetExitCodeThread后结束值一直STILL_ACTIVE,259的问题的主要内容,如果未能解决你的问题,请参考以下文章

windows API主线程如何等待子线程结束后再继续运行

如何实现线程互等,线程2等待线程1结束后才继续执行。(可设置标志位) 求源代码

父线程 在创建了子线程后,是否继续执行自己的代码?它可以在子线程结束前 结束吗?

java线程执行完后自己结束吗

Java Thread.join()详解--父线程等待子线程结束后再结束

java 如何判断一个线程结束