WaitForSingleObject的作用[转]
总结: WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds)是主线程等待hHandle对应的线程.
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情(比如主线程等待子线程结束完之后,自己再结束),要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。
那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开,那么我们的线程该如何知道这个文件现在有没有被别的线程访问呢?我们可以让线程等在一个死循环里,这个循环之一在尝试打开访问这个文件,直到能够打开为止;这样做虽然可以实现目的,但是死循环会占用大量的内存,所以windows就设置了信号量。信号量的作用简单理解就是一个标志位,在我们上述的问题中,这个文件就有一个信号量,初始时我们设信号量为FALSE,而只有当信号量为FALSE时线程才可以打开访问这个文件。那么,当第一个线程到达,信号量为FALSE,线程打开文件进行访问,并将信号量置为TRUE;在第一个线程在访问文件时,第二个线程到来,此时信号量仍未TRUE,所以第二个线程等待,这个等待的过程就是WaitForSingleObject。WaitForSingleObject在等待的过程中会进入一个非常高效的沉睡等待状态,只占用极少的CPU时间片。
WaitForSingleObject()
1. 格式
DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有两个参数,分别是THandle和Timeout(毫秒单位)。
如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。
2. 使用对象
它可以等待如下几种类型的对象:
Event,Mutex,Semaphore,Process,Thread
3. 返回类型
有三种返回类型:
WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因
代码例如下:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std; int i = ;
DWORD WINAPI FunProc(LPVOID lpParameter); DWORD WINAPI FunProc(LPVOID lpParameter)
{
for (; i < ; i++)
{
if (!(i % ))
cout << endl;
else
cout << i << endl;
}
return ;
} void main()
{
cout << i << endl;
HANDLE hThread;
hThread = CreateThread(NULL, , FunProc, NULL, , NULL);
DWORD dwRet = WaitForSingleObject(hThread, );
if (dwRet == WAIT_OBJECT_0)
{
cout<< "创建的线程执行结束" << endl;
}
if (dwRet == WAIT_TIMEOUT)
{
cout<< "等待超时" << endl;
}
if (dwRet == WAIT_ABANDONED)
{
cout<< "Abandoned" << endl;
}
CloseHandle(hThread);
system("pause");
}
结果为:

这段代码中,首先在开始定义一个变量 i 为 0 ,然后在主函数中先将其输出便有了结果中第一行的 0 。
之后我们开启线程,进入线程函数FunProc,在FunProc中将 i++ 对 10 取余输出,一直到 i > 10 结束循环,线程结束,这是返回给WaitForSingleObject的结果为WAIT_OBJECT_0,表示线程正常结束,并将结果输出。
这其中WaitForSingleObject的效果就相当于一个关卡,只有返回给了WaitForSingleObject结果程序才能继续执行,当然线程不一定能正常执行结束,也可能会出现:

这就是未能等到线程结束信号量的等待时间就耗光了。我们也可以将WaitForSingleObject的第二个参数设置为 INFINITE,就可以一直等待。
线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回(那区别在哪呢? 一个是有信号的主动返回,另一个是没信号的超时被动返回)
————————————————
版权声明:本文为CSDN博主「LL596214569」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LL596214569/article/details/81088862
这个帖子里讲了使用超时时间的作用:

解决方案:
要解决等待并刷新,可以
重复
ret:= WaitforSingleObject(ProcessInfo.hProcess ,100); //等待
Application.ProcessMessages;
直到ret&lt; Wait_Timeout;
即每次只等待很短的时间,然后刷新界面,如果程序没有运行完成,则继续等待,否则
跳出。
另一篇文章,里面讲到了一个比较有用的功能:也讲了获取进程的一些方法
WaitForSingleObject的用法-(判断一个程序是否结束)
https://blog.csdn.net/iteye_3224/article/details/82123379
WaitForSingleObject的作用[转]的更多相关文章
- WaitForSingleObject的详细用法
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObj ...
- 线程创建后为什么要调用CloseHandle
很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); ...
- 【多线程】C++ 互斥锁(mutex)的简单原理分析
多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,分为两种类型的多任务处理:基于进程和基于线程. 1)基于进程的多任务处理是程序的并发执行. 2)基于线程 ...
- WaitForSingleObject 和 WaitForMultipleObjects函数
1.WaitForSingleObject 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.这些等待函数中最常用的是WaitForSingleObject: DWORD ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 事件函数SetEvent、PulseEvent与WaitForSingleObject详解
系统核心对象中的Event事件对象,在进程.线程间同步的时候是比较常用,发现它有两个出发函数,一个是SetEvent,还有一个PulseEvent, 两者的区别是: SetEvent为设置事件对象为有 ...
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...
- 线程 (detach的作用)
线程状态在一个线程的生存期内,可以在多种状态之间转换.不同操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状 态还可以包含多个子状态.但大体说来,如下几种状态是通用的: 就 ...
- 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别
Mutex与Event控制互斥事件的使用详解 最近写一程序,误用了Mutex的功能,错把Mutex当Event用了. [Mutex] 使用Mutex的主要函数:CreateMutex.ReleaseM ...
随机推荐
- QT的总结文章(转)
★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★了解Qt的元对象系统 ★掌握Qt的架构 ★理解Qt的事件模型,掌握其使用的时机 信号与槽.元对象系统.事件模型是Qt机制的 ...
- vue中引入了sass,又引入cssnano报错
"cssnano": { // preset: "advanced", autoprefixer: false, "postcss-zindex&qu ...
- java生成快递单并调用打印机打印
生成快递单过程中需要生成条形码,生成条形码可参考:https://www.cnblogs.com/linbky/p/12091248.html 下面这段代码生成的快递单是完全符合京东快递的10 x 1 ...
- SSH框架整合-myeclipse
项目结构 1.mysql数据库 stuinfo /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : Database - stuinfo ****** ...
- PHP curl_errno函数
curl_errno — 返回最后一次的错误号 说明 int curl_errno ( resource $ch ) 返回最后一次cURL操作的错误号. 参数 ch 由 curl_init() 返回的 ...
- 4412 i2c驱动
1.Linux主机驱动和外设驱动分离思想 外设驱动→API→主机驱动→板机逻辑--具体的i2c设备(camera,ts,eeprom等等) 2.主机驱动 根据控制器硬件手册,操作具体的寄存器,产生波形 ...
- [杂题]:C/c(二分答案)
题目传送门(内部题54) 输入格式 第一行一个整数表示$n$.第二行$n$个整数表示初始序列.(这行原题没有,是我加的)接下来$2n$行每行两个整数,分别表示$X_i,Y_i$.数据保证至少存在一种方 ...
- 重温HTML和CSS3
重温Web前端基础 本篇幅中着重文字,只是记录一些自己的见解,巩固下自身基础 网页结构是什么? 结构层 html 导航,列表,段文字,图片,链接,表示层 css 颜色,大小,位置,行为层 JavaSc ...
- 因果卷积(causal)与扩展卷积(dilated)
因果卷积(causal)与扩展卷积(dilated)之An Empirical Evaluation of Generic Convolutional and Recurrent Networks f ...
- 【python3】装饰器
参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...