如何等待线程结束
1个回答
展开全部
等待一个线程的结束
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()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。
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()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询