最近在用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的问题的更多相关文章

  1. 线程池 多线程运行结束后 如何关闭? ExecutorService的正确关闭方法

    前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 ...

  2. Android 如何监听一个线程的开始和结束

    方法一:轮训 比如主线程要等子线程在得到变量“val”值的时候开始用“val”的值来进行工作,使用轮训的方法如下: public class SubThread extends Thread{ pri ...

  3. c# 用正则表达式获取开始和结束字符串中间的值

    c# 用正则表达式获取开始和结束字符串中间的值 /// <summary> /// 获得字符串中开始和结束字符串中间得值 /// </summary> /// <para ...

  4. C# GetValueList 获得字符串中开始和结束字符串中间得值列表

    /// <summary> /// 获得字符串中开始和结束字符串中间得值列表 /// </summary> /// <param name="styleCont ...

  5. 【setUp-tearDown】线程组开始,结束各执行一次

    使用setUp线程组的方式  ——> 开始 使用tearDown线程组 的方式 ——>结束

  6. Linux线程的几种结束方式

    Linux创建线程使用 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) ...

  7. java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)

    多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...

  8. My97DatePicker 日期控制,开始时间不能>结束时间,结束时间不能<开始时间

    <li>日期: <input type="text" style="margin-top: 5px;" value="${begin ...

  9. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

随机推荐

  1. [MySQL优化] -- 如何了解SQL的执行频率

    MySQL 客户端连接成功后,通过 show [session|global]status 命令 可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extended-status ...

  2. Qt 之 qInstallMessageHandler(日志重定向至文件)

    Qt 日志重定向到文件 #include <QCoreApplication> #include <QDebug> #include <QMutex> #inclu ...

  3. NPM全局安装软件包时解决EACCES权限错误

    NPM全局安装软件包时解决EACCES权限错误 Resolving EACCES permissions errors when installing packages globally npm WA ...

  4. [人物存档]【AI少女】【捏脸数据】洛莉

    点击下载(城通网盘):AISChaF_20191111003514067.png 点击下载(城通网盘):AISChaF_20191112014313168_20191113_232904.png

  5. yarn是什么?

    yarn是个包管理器.你可以通过它使用全世界开发者的代码, 或者分享自己的代码. 从 npm 安装软件包并保持相同的包管理流程. 优点:         1.速度超快. Yarn 缓存了每个下载过的包 ...

  6. LinkedBlockingQueue 实现 生产者 消费者

    转载:https://blog.csdn.net/sinat_36553913/article/details/79533606 Java中使用LinkedBlockingQueue实现生产者,消费者 ...

  7. luogu 1169 [ZJOI2007]棋盘制作 悬线dp

    悬线法,虽然得不到局部最优解,但是一定能得到全局最优解的算法,十分神奇~ #include <cstdio> #include <algorithm> #define N 20 ...

  8. STL漫谈

    从现在开始,想写一个关于STL工具的各种tip类的东西,记录下那些细节,以免以后使用STL工具时出错. 1.关于map,如果需要第一个键值需要放进一个结构体,那么结构体是需要写好其自定义的排序规则的, ...

  9. 苹果系统OSX中Automator批量重命名

    Automator,看字面意思就无比强大,[自动机器].有什么能比自动还让人着魔? 答案是没有✔ 如果你用的是mac,如果你有一堆文件要重新整理命名,如果你还在Goole什么"批量重命名软件 ...

  10. golang的写文件测试

    package main import ( "os" "strings" "time" "fmt" "strc ...