社区
进程/线程/DLL
帖子详情
如何判断线程已结束
m_blackpp
2008-08-07 09:46:51
如题
handle=AfxBeginThread(NbtstatThread,(LPVOID)this,THREAD_PRIORITY_NORMAL);
设置全局 变量 判断 会因为线程要运行一段时间失效
死循环判断变量BREAK;会使程序卡住
WaitForSingleObject(handle,100);
没有用.
不希望在线程的最后POSTMessage,因为我是循环起动线程的,不好控制.
...全文
2703
10
打赏
收藏
如何判断线程已结束
如题 handle=AfxBeginThread(NbtstatThread,(LPVOID)this,THREAD_PRIORITY_NORMAL); 设置全局 变量 判断 会因为线程要运行一段时间失效 死循环判断变量BREAK;会使程序卡住 WaitForSingleObject(handle,100); 没有用. 不希望在线程的最后POSTMessage,因为我是循环起动线程的,不好控制.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gaoteng1984
2008-08-07
打赏
举报
回复
阻塞方式:
DWORD rtn = WaitForSingleObject(handle, INFINITE);
if (rtn == WAIT_OBJECT_0)
{
线程已结束...
}
非阻塞方式:
while(true)
{
DWORD rtn = WaitForSingleObject(handle,100);
if (rtn == WAIT_OBJECT_0)
{
线程已结束...
break;
}
。。。Do other things...
}
草帽
2008-08-07
打赏
举报
回复
如果线程未退出,WaitForSingleObject(handle, INFINITE)会进入阻塞状态,怎么会没有用呢;
cathypu
2008-08-07
打赏
举报
回复
WaitForSingleObject(handle, INFINITE);
thirddata
2008-08-07
打赏
举报
回复
判断线程结束,只有waitforsingleobject了,
“死循环判断变量BREAK;会使程序卡住 ”,你可以循环一次,sleep(50)不久行李。
nevergone
2008-08-07
打赏
举报
回复
BOOL WINAPI GetExitCodeThread(
__in HANDLE hThread,
__out LPDWORD lpExitCode
);
dwen20
2008-08-07
打赏
举报
回复
WaitForSingleObject(handle,INFINITE);
然后
if(GetLastError()== WAIT_OBJECT_0)
真,则说明结束了
schlafenhamster
2008-08-07
打赏
举报
回复
用WaitForSingleObject(handle, INFINITE);
不起作用可能是等待时间太短所致
吹泡泡的小猫
2008-08-07
打赏
举报
回复
wait的时间太短了,你确定100ms线程能结束?如果同时创建大量的线程,建议使用线程池管理,windows有,也可以使用其它的线程池类,codeproject上有个CThreadPool类,可以试试
qzmguy
2008-08-07
打赏
举报
回复
终止线程有三种方法:
1.线程可以在自身内部调用AfxEndThread()来终止自身的运行
2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
然后调用CloseHandle()函数释放线程所占用的堆栈
TerminateThread会有资源泄漏,不要万不得已,不要用这个函数
DWORD code;
if(GetExitCodeThread(MonitorComm,&code)) //MonitorComm 你创建的线程句柄
if(code==STILL_ACTIVE)
{
TerminateThread(MonitorComm,0);
CloseHandle(MonitorComm);
}
这样就安全了
3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。
下面的例子来演示第三种方法
全局变量m_end来表示是否要结束线程
bool m_end = false;
HWND hWnd;
启动线程:
CWinThread* pThread;
hWnd = GetSafeHwnd();
pThread = AfxBeginThread(ThreadProc,hWnd);
pThread->m_bAutoDelete = false;
线程的函数
UINT ThreadProc(LPVOID pParam);
UINT ThreadProc(LPVOID pParam)
{
while(!m_end)
{
AfxMessageBox("test;");
::Sleep(2000);
}
return 0;
}
终止线程代码
m_end = true;
WaitForSingleObject(pThread->m_hThread,INFINITE); //等待线程结束
delete pThread; //删除线程
qzmguy
2008-08-07
打赏
举报
回复
以下是引用片段:引自<<windows核心编程>>
6.5 终止线程的运行
若要终止线程的运行,可以使用下面的方法:
? 线程函数返回(最好使用这种方法)。
? 通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。
? 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该避免使用这种方法)。
? 包含线程的进程终止运行(应该避免使用这种方法)。
下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。
6.5.1 线程函数返回
始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
? 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。
? 操作系统将正确地释放线程堆栈使用的内存。
? 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
? 系统将递减线程内核对象的使用计数。
判断
线程
是否已经
结束
一代码 #include <iostream> #include <pthread.h> #include <signal.h> #include <unistd.h> //sleep #include "errno.h" using namespace std; void *thfunc(void *arg) //
线程
函数...
判断
线程
是否
结束
的方法
1、 GetExitCodeThread 比较原始的方法了,调用 GetExitCodeThread,如果返回STILL_ACTIVE,那就是还在运行,否则,会返回退出代码. 该方法的优点是除了可以
判断
是否已经退出,还可以获取到退出代码,也就是可以
判断
退出原因. 该方法在调用后,会立即返回,如果需要等待
线程
调用,请放在一个循环内循环调用. 2、WaitForSingleObject 听起来都比较先进的方法.等待
线程
的内核对象被激发,
如何
判断
线程
是否都
结束
了
方法1:通过Thread类中的isAlive()方法
判断
线程
是否处于活动状态。
线程
启动后,只要没有运行完毕,都会返回true。 【注】如果只是要等其他
线程
运行
结束
之后再继续操作,可以执行t.join(),即:在t执行完毕前挂起。 方法2:通过Thread.activeCount()方法
判断
当前
线程
的
线程
组中活动
线程
的数目,为1时其他
线程
运行完毕。 方法3:通过java....
java
判断
线程
结束
_java中如何
判断
一个
线程
是否
结束
我们可以通过调用thread.Join()方法,把要
判断
的
线程
加入到当前
线程
中,这样可以将两个交替执行的
线程
合并为顺序执行的
线程
。如果顺利执行,则说明该
线程
未
结束
。(视频教程推荐:java视频)比如在
线程
B中调用了
线程
A的Join()方法,直到
线程
A执行完毕后,才会继续执行
线程
B。t.join(); //调用join方法,等待
线程
t执行完毕t.join(1000); //等待 t
线程
...
Python多
线程
以及
判断
线程
是否
结束
python,多
线程
,
结束
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章