如何判断一个线程是否执行完毕。。。

philistine_x 2011-09-24 09:41:58
我用_beginthreadex 开始线程执行操作。。
如果该线程没执行完。。
则_endthreadex 关闭这个线程 重新起一个线程。。
...全文
5540 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
职业炒股 2011-10-08
  • 打赏
  • 举报
回复
设置一个变量吧。在外面判断一下就行了。。。
jianuMan 2011-09-30
  • 打赏
  • 举报
回复
设置一个 信号量 在new 出来的线程里面 SetEvent
在主线程里面 WaitForSingleObject 等待该信号量
ysok7878 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 quwei197874 的回复:]
用个事件和waitforsingleobject协作式退出
[/Quote]
正解,不过没有循环一般就不需要了,程序执行得很快的
schlafenhamster 2011-09-27
  • 打赏
  • 举报
回复
BOOL GetExitCodeThread(
HANDLE hThread, // handle to the thread
LPDWORD lpExitCode // address to receive termination status
);
schlafenhamster 2011-09-27
  • 打赏
  • 举报
回复
// wait for NotePad finishes
if(fsuccess)
{
HANDLE hProcess=pinfo.hProcess;
CloseHandle(pinfo.hThread);// close thread at once
if (bWait)
{
if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
{
DWORD dwExitCode;
GetExitCodeProcess(hProcess,&dwExitCode);
if (dwExitCode==STILL_ACTIVE) AfxMessageBox(IDS_NOTEPAD_ALIVE);
}
}
CloseHandle(pinfo.hProcess);
}
t22tang 2011-09-27
  • 打赏
  • 举报
回复
线程不循环就不需要用waitforsingleobject
微笑的鱼 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 philistine_x 的回复:]

里面没有循环 。。就是操作很多。。我要判断 这个线程依然是否存在 存在则关闭这个线程。。。
[/Quote]

没有循环,线程函数执行完时,线程就会自动结束了。要注意的是线程句柄要在外部关闭,防止句柄泄露。
_endthreadex最好不要用,有时候会出问题,用return使线程函数退出就可以了。
philistine_x 2011-09-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sinservice 的回复:]

则_endthreadex 关闭这个线程 重新起一个线程。。

====

场景上是错误的。

不能在线程外部调用endthreadex,那样关闭的是调用者的线程。
[/Quote]

刚才试了下。结果程序都退出了。。
「已注销」 2011-09-24
  • 打赏
  • 举报
回复
则_endthreadex 关闭这个线程 重新起一个线程。。

====

场景上是错误的。

不能在线程外部调用endthreadex,那样关闭的是调用者的线程。
philistine_x 2011-09-24
  • 打赏
  • 举报
回复
里面没有循环 。。就是操作很多。。我要判断 这个线程依然是否存在 存在则关闭这个线程。。。
cl079074282 2011-09-24
  • 打赏
  • 举报
回复
用waitforsingleobject(hThread,timeout)等待线程结束,一般如果线程里面没有循环就不用了,执行完就结束了
quwei197874 2011-09-24
  • 打赏
  • 举报
回复
用个事件和waitforsingleobject协作式退出
luozhongzhu 2011-09-24
  • 打赏
  • 举报
回复
线程函数执行完后,线程会自动结束,不用调用_endthreadex,如果非要结束线程,给楼主一个参考代码:

HANDLE g_hThread = NULL;

DWORD dw = WaitForSingleObject(g_hThread, 0);

if(dw == WAIT_TIMEOUT) //线程正在运行
{
TerminateThread(g_hThread, dwExitCode); //不建议强制结束

if(g_hThread != NULL)
{
CloseHandle(g_hThread); //关闭线程句柄,可能线程已结束,但句柄还没释放
g_hThread = NULL;
}
DWORD dwThreadId = 0;//新建一个线程
g_hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &dwThreadId);
}

15,471

社区成员

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

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