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()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。
线程句柄作WaitForSingleObject的参数是什么意思
线程结束时,waitforsingleObject才有信号。
》》hThread1代表的线程如果在运行,就要一直等下去,直到线程退出来吗?
是否一直等下去,取决于第二个参数传入的内容。如下所示:
INFINITE:像你所使用的那样传入此参数,此函数会一直等待下去。
0 :函数检测对象状态并立即返回
》0 :如果超出等待时间,线程仍然处于非信号状态,将返回WAIT_TIMEOUT
怎样添加CEvent在MFC中,我想等线程A结束后再执行线程B,想用WaitForSingleObject来实现,
1. 创建CEvent实例
2. 在启动线程A时,将该实例传入线程A
3. 在线程A结束前,调用CEvent的SetEvent()成员
4. 在启动线程B的前面,等待CEvent的实例句柄
::WaitForSingleObject(pEvent-》m_hObject, INFINITE);

更多文章:
solitaire(谁能翻译westlife的solitaire翻译)
2026年10月14日 23:50
shell脚本if判断多个条件(shell中if怎么判断多个条件)
2026年10月14日 22:40
progressive trance(trance 与 techno 详细解释)
2026年10月14日 21:50
php培训机构有哪些(天津有口碑不错的的学习PHP的培训机构推荐吗)
2026年10月14日 21:20
tcp三次握手详细过程(TCP/IP三次握手具体过程是什么)
2026年10月14日 21:00





