如何等待线程结束

 我来答
负运日6981
2016-01-09 · 超过65用户采纳过TA的回答
知道答主
回答量:121
采纳率:0%
帮助的人:79.7万
展开全部
等待一个线程的结束
Win32 提供WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2。

调用 WaitForSingleObject()并放置一个“线程句柄”作为参数,将使线程#1开始睡眠,直到线程#2结束。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等待时间。

DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
hHandle:等待对象的 handle(代表一个核心对象)。

dwMilliseconds:等待的最长时间。时间终了,即使 handle尚未成为激发状态,此函数也要返回。此值可以是0(代表立刻返回),也可以是 INFINITE代表无穷等待。

如果函数失败,返回WAIT_FAILED。这时可调用 GetLastError()取得更多信息。

此函数的成功有三个因素:

1. 等待的目标(核心对象)变成激发状态。返回值为WAIT_OBJECT_0。

2. 核心对象变成激发状态之前,等待时间终了。返回值为WAIT_TIMEOUT。

3. 如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回 WAIT_ABANDONED。(abandoned:废弃)

获得一个线程对象的 handle之后,WaitForSingleObject()要求操作系统让线程 #1 睡眠,直到以下任何一种情况发生:

1. 线程#2结束

2. dwMilliseconds时间终了。该值系从函数调用后开始计算。

由于操作系统持续追踪线程#2,即使线程#2 失事或被强迫结束,WaitForSingleObject()仍然能够正常运作。

如果想一直等待某个线程,直到线程退出,可以用如下代码:

WaitForSingleObject( hThrd, INFINITE );
关于time-out,有一个特别重要的用途,但很少被人注意。设定time-out为0,能够检查handle的状态并立刻返回,没有片刻停留。如果handle已经备妥,那么这个函数会成功并传回 WAIT_OBJECT_0。否则,这个函数立刻返回并传回 WAIT_TIMEOUT。

另外可以利用 time-out提供一个动画,表示正在等待某个线程的结束。可以每 500毫秒就time-out一次,更新图示,然后再继续等待。

WaitForSingleObject()可以面对许多种 handles工作,不一定非要是的线程 handle。事实上,Win32中大部分以HANDLE表示的对象都能够作为 WaitForSingleObject()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式