如何判断线程已结束

m_blackpp 2008-08-07 09:46:51
如题
handle=AfxBeginThread(NbtstatThread,(LPVOID)this,THREAD_PRIORITY_NORMAL);
设置全局 变量 判断 会因为线程要运行一段时间失效
死循环判断变量BREAK;会使程序卡住
WaitForSingleObject(handle,100);
没有用.
不希望在线程的最后POSTMessage,因为我是循环起动线程的,不好控制.
...全文
2703 10 打赏 收藏 转发到动态 举报
写回复
用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 + +对象均将通过它们的撤消函数正确地撤消。

? 操作系统将正确地释放线程堆栈使用的内存。

? 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。

? 系统将递减线程内核对象的使用计数。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧