【WIN32】【线程】WaitForSingleObject 函数详解

《Win32多线程程序设计》(1)---WaitForSingleObject() //调用WaitForSingleO bject() 并放置一个“线程核心对象”作为参数,将 //使线程#1  开始睡眠,直到线程#2  结束为止。就像Sleep()  函数一样, //WaitForSingleObject() 也有一个参数用来指定最长的等待时间 //DWORD WaitForSingleObject( // __in HANDLE hHandle, // _ 阅读详情

代码说明

demo很简单也很容易理解。可以使用这种方式来终止线程。看代码时你只需要关注g_hEvent 变量即可,先创建,然后让WaitForSingleObject等待这个信号的变化即可。

代码

// WaitForSingleObject.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE g_hEvent;

DWORD WINAPI MyThreadProc1(PVOID pParam);
DWORD WINAPI MyThreadProc2(PVOID pParam);
int main()
{
	g_hEvent = NULL;
	cout << "test WaitForSingleObject" << endl;
	g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	// SetEvent(g_hEvent);
	CreateThread(NULL, 0, MyThreadProc1, NULL, 0, NULL);
	CreateThread(NULL, 0, MyThreadProc2, NULL, 0, NULL);

	system("pause");

	return 0;
}

DWORD WINAPI MyThreadProc1(PVOID pParam)
{
	static int i = 0;
	while (1)
	{
		cout << "\nMyThreadProc1 come in " << i++ << endl;
		//DWORD dwReturn = WAIT_OBJECT_0;
		DWORD dwReturn = WaitForSingleObject(g_hEvent, 2 * 1000);
		switch (dwReturn)
		{
		case WAIT_OBJECT_0:
			// hProcess所代表的进程在5秒内结束
			cout << "MyThreadProc1 >>> WAIT_OBJECT_0" << endl;
			return 0;

		case WAIT_TIMEOUT:
			// 等待时间超过5秒
			cout << "MyThreadProc1 >>> WAIT_TIMEOUT" << endl;
			break;

		case WAIT_FAILED:
			// 函数调用失败,比如传递了一个无效的句柄
			cout << "MyThreadProc1 >>> WAIT_FAILED" << endl;
			break;
		default:
			cout << "MyThreadProc1 >>> default" << endl;
		}

		cout << "MyThreadProc1 leave" << endl;
	}
	
	return 0;
}

DWORD WINAPI MyThreadProc2(PVOID pParam)
{

	cout << "\n----------------------\nMyThreadProc2 come in" << endl;
	int i = 0;
	while (i++ < 8)
	{
		cout << "MyThreadProc2:" << i << endl; 
		Sleep(1 * 1000); // 为了证明只有释放信号,线程1才能执行
	}

	//SetEvent(g_hEvent); // 释放信号
	cout << "MyThreadProc2 >>> send g_hEvent signal" << endl;
	SetEvent(g_hEvent);
	cout << "MyThreadProc2 leave\n----------------------" << endl;

	return 0;
}
Win 32 多线程程序设计学习笔记之三:*WaitFor*Object函数 1.等待一个线程的结束 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 参数 hHandle: 等待对象的 handle(代表一个核心对象)。在本例中,此为线程 handle。 dwMilliseconds :等待的最长时间。时间终了,即使 handle 尚未成为激发状态,此函数还是要返回。此值可以是 0 阅读详情

相关推荐

Win32线程——等待另一个线程结束

《Win32多线程程序设计》–Jim Beveridge & Robert Wiener “等待某个什么东西”是线程常常需要做的事。等待是线程的“必要之恶”。 如果你没有等待线程结束就莽撞地结束程序,线程会被系统强制结束掉——在它完成它的工作之前。 由于让线程停工是操作系统的责任,很合理地我们会认为操作系统也有责任让其他线程知道某个线程停工了。 Sleep()这个函数要求操作系统中止

SangYang 5618

《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“等待函数”

  用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。   但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。   Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信...

weixin_30300225的博客 2078

C++程序中 WaitForSingleObject 函数的诸多用途与使用场景总结

本文详细介绍WaitForSingleObject函数在多线程编程中的多种使用场景,包括在多线程之间实现锁的等待、线程中实现Sleep、监测线程或进程是否退出等。

dvlinker的技术专栏 3万+

WaitForSingleObject等待函数

等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。最常用是WaitForSingleObject。);参数1:用来标识要等待的内核对象,这个内核对象可以处于触发状态或未触发状态。参数2:用来指定线程最多愿意花多长的时间来等待对象被触发(超时时间,单位为毫秒)如果指定了一个非0值,则该函数将等待,直到该对象被触发或时间间隔过去。如果为0,如果对象没有触发,函数不会进入等待状态,它总是立即返回。...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 5835

Windows C++多线程:使用WaitForSingleObject与WaitForMultipleObjects进行线程等待

在上面的示例中,首先使用CreateThread函数创建一个线程,并获取线程的句柄。其中,nCount参数是要等待的内核对象的数量,lpHandles参数是一个指向内核对象句柄数组的指针,bWaitAll参数指定是否等待所有对象(TRUE表示等待所有对象,FALSE表示等待任意一个对象),dwMilliseconds参数是等待的超时时间(以毫秒为单位)。其中,hHandle参数是要等待的内核对象的句柄(例如线程句柄、事件句柄等),dwMilliseconds参数是等待的超时时间(以毫秒为单位)。

2301_79325339的博客 667

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4347

Win32学习笔记 | CreateThread, WaitForSingleObject函数

CreateThread 是 kernel32.dll 中的一个函数,可用于在调用进程的虚拟地址空间内创建一个新线程来执行代码

JUST FOR FUN, CALM DOWN 625

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 606

WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle

Win32 提供WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2。 调用 WaitForSingleObject()并放置一个“线程句柄”作为参数,将使线程#1开始睡眠,直到线程#2结束。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等

nokianasty的专栏 3910

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3152

zynq 7010/020 AMP双核通信-Vitis2023/2024

在platform cpu1设置中添加;注意value中使用空格分开程序思路:比较简单。

weixin_43310175的博客 918

线程同步之Win32API的Wait函数

线程同步之Win32API的Wait函数Win32API中的Wait函数非常重要,很多同步都需要Wait函数的配合,Wait函数很多,常用的我就不赘述了,只对一些有用但不常用的函数做一些描述。1.WaitForSingleObject最常用的函数,不用多说了。对于信号灯和信号量,每用一次,信号量减一。DWORD WaitForSingleObject( HANDLE

amd k_7的专栏 4128

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3603

Win32多线程之等待一个线程的结束(WaitForSingleObject)

由于线程停工是操作系统的责任,当然操作系统也有责任让其他线程知道某个线程停工了。    Win32提供了一个名为WaitForSingleObject()的函数。他的第一个参数是个核心对象(如线程)的handle,为了方便讨论,我把即将等待的线程称为线程#1,把正在执行的线程称为线程#2。刚刚说的“线程核心对象”指的是线程#2。   调用WaitForSingleObject()并放置一个“线

wjj715211的专栏 2097

告别远程控制弹窗:免Root实现投射与录制敏感信息自动授权

本文针对Android远程控制中频繁出现的‘在投射和录制时显示敏感信息’弹窗问题,提供了一套免Root的自动化解决方案。通过结合Shizuku与App Ops两款工具,无需破解系统即可静默授予屏幕投射与录制权限,从而实现稳定、无干扰的远程协助、家庭监控或自动化测试,彻底告别手动授权弹窗的烦恼。

qsc9012345的博客 721

NV 英伟达2022数字芯片笔试题

作者:数字IC打工人 链接:【开卷】第27期 NV 英伟达2022数字芯片笔试题_笔经面经_牛客网 来源:牛客网 1、Single Choice: Given thefollowing FIFO and rules, how deep does the FIFO need to be to preventunderflow or overflow? RULES: clk_A=25MHz; clk_B=100MHz; en_B is periodically asserted: period.

weixin_44072819的博客 6391

【Win32多线程】如何避免线程等待浪费CPU时间,降低对系统资源的冲击?

如何避免线程浪费CPU时间? 等待是线程的必要之恶。 两个等待技术: 1.Win32的Sleep()函数,要求操作系统终止线程动作,直到度过某个指定时间之后才恢复。(不能事先知道等多久)   2.busy loop,不断调用GetExitCodeThread(),直到其结果不再是STILL_ACTIVE.(缺点浪费CPU时间),绝对不要在Win32中使用busy loop 下面的程序

xiaoding133的专栏【Stay hungry,Stay foolish】 6290

【100%通过率】华为OD机试真题 Python 实现【最多组合直角三角形个数】【2023 Q1 | 100分】

有N条线段,长度分别为a[1]-a[n]。 现要求你计算这N条线段最多可以组合成几个直角三角形。 每条线段只能使用一次,每个三角形包含三条线段。

MISAYAONE的博客 1万+

Win32多线程的创建方法和基本使用

Summary: 总结Win32提供的创建多线程相关的API接口和基本的使用框架。 Ref: MSDN: http://msdn.microsoft.com/zh-cn/library/y6h8hye8(v=VS.100) Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)

。。。。 9264

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WIN32多线程二 用WaitXXX函数等待线程结束

等待线程结束的更好方法是调用API WaitForSigleObject和WaitForMultipleObjects。前者用于等待一个线程由未激发状态变为激发状态,后者用于等待多个线程中全部或多个中的一个由未激发状态变为激发状态。对线程内核对象而言,如果线程在运行,则是未激发状态;如果线程已经退出,则是激发状态。不同内核对象的激发、未激发状态含义有所不同。DWORD WINAPI WaitFor...

cpongo5 271

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Win32 多线程开发系列】Win32多线程程序设计读书笔记 -- 章三

Windows Services 开发系列(多线程开发) (一) – Win32多线程程序设计读书笔记–章三 【1】Win32典型多线程处理函数 (1).WaitForSingleObject函数,功能等待一个线程对象结束; DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 参数 hHandle 等待对象的 ha...

CopperSun 技术博客 414

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Win32API多线程程序设计学习笔记

http://blog.sina.com.cn/s/blog_499b249c010003nw.html    Win32API多线程程序设计学习笔记 CreateThread 函数功能:该函数创建一个在调用进程的地址空间中执行的线程。 函数原型:  HANDLE  CreateThread (  LPSECURITY_ATTRIBUTES lpThreadAttributes,

孙建军的博客 950

【Win32 多线程程序设计基础第三章笔记】

本文档基于《Win32多线程程序设计.pdf》第三章内容整理,全程围绕Win32多线程中“等待机制”展开,针对零基础读者设计——不堆砌复杂术语,而是用“朋友打印文件”“线程信号灯”等通俗比喻,结合文档中原版代码案例,拆解“为什么要高效等待”“如何等待单个线程”“如何定时触发任务”“如何等待多个对象”“GUI程序如何兼顾等待与UI响应”等核心问题,所有知识点均来自指定文档,未添加外部内容,确保内容的准确性与针对性。

云小逸的博客 897
上一篇: 【WIN32】获取CPU状态
下一篇: 【Qt】常用基础代码汇总(随时更新)
欧恩意
博客等级 码龄7年 677粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值