线程结束,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的问题的更多相关文章
- 线程池 多线程运行结束后 如何关闭? ExecutorService的正确关闭方法
前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 ...
- Android 如何监听一个线程的开始和结束
方法一:轮训 比如主线程要等子线程在得到变量“val”值的时候开始用“val”的值来进行工作,使用轮训的方法如下: public class SubThread extends Thread{ pri ...
- c# 用正则表达式获取开始和结束字符串中间的值
c# 用正则表达式获取开始和结束字符串中间的值 /// <summary> /// 获得字符串中开始和结束字符串中间得值 /// </summary> /// <para ...
- C# GetValueList 获得字符串中开始和结束字符串中间得值列表
/// <summary> /// 获得字符串中开始和结束字符串中间得值列表 /// </summary> /// <param name="styleCont ...
- 【setUp-tearDown】线程组开始,结束各执行一次
使用setUp线程组的方式 ——> 开始 使用tearDown线程组 的方式 ——>结束
- Linux线程的几种结束方式
Linux创建线程使用 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) ...
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...
- My97DatePicker 日期控制,开始时间不能>结束时间,结束时间不能<开始时间
<li>日期: <input type="text" style="margin-top: 5px;" value="${begin ...
- c# winform TreeView NODE(节点) 重命名或获取节点修改后的值
在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...
随机推荐
- NOI2018 你的名字——SAM+线段树合并
题目链接在这里洛谷/LOJ 题目大意 有一个串\(S\),每次询问给你一个串\(T\),两个数\(L\)和\(R\),问你\(T\)有多少个本质不同的子串不是\(S[L,R]\)的子串 SOLUTIO ...
- hdu4612 Warm up[边双连通分量缩点+树的直径]
给你一个连通图,你可以任意加一条边,最小化桥的数目. 添加一条边,发现在边双内是不会减少桥的.只有在边双与边双之间加边才有效.于是,跑一遍边双并缩点,然后就变成一棵树,这样要加一条非树边,路径上的点( ...
- File "/usr/bin/pip", line 11, in <module> sys.exit(__main__._main()) AttributeError: 'module' object has no attribute '_main'
多个版本pip共存导致 直接使用pip2进行安装即可 如:pip2 install requests
- 基于VS2013的MFC窗体按钮事件触发案例(亲测可用)
学过python的小朋友们一定对python freeze命令不陌生,这一命令用于导出python安装模块,用于新电脑可以快速的配置安装所需的模块,以便快速的加入项目. 那么我们大可以用 window ...
- unity shader 剔除指定的颜色
Shader "MyShader/PaintingBGTransparency" { Properties{ _MainTex("Base (RGB)", 2D ...
- 引爆炸弹——DFS&&联通块
题目 链接 在一个$n \times m$方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地 ...
- mysql慢查询配置(5.7)
刚装了Windows版mysql,想开启慢查询日志. 修改D:\mysql-5.7.23-winx64下my.ini配置文件,添加: [mysqld]slow_query_log = onslow_q ...
- axios请求提交的form data格式 明明是JSON格式的参数却转成了字符串格式
问题:传的参数成为了字符数格式 解决:把参数的格式转换 const params = new URLSearchParams() params.append('USER_LOGIN', 'admin' ...
- OFDM时域削峰法降峰均比的原理及影响
以下是对实验室师兄答疑的转述,经加工后的文字不可避免的存在一些噪声,仅供参考: 时域削峰为非线性变换,效果上相当于将时域中功率较大值的信号点,减去一个合适的“抵消”信号点的功率,使其降低到所设置的门限 ...
- JSONOjbect,对各种属性的处理
import com.alibaba.fastjson.JSONObject; public class JsonTest { public static void main(String[] arg ...