MFC WaitForSingleObject函数

C++程序中 WaitForSingleObject 函数的诸多用途与使用场景总结 本文详细介绍WaitForSingleObject函数在多线程编程中的多种使用场景,包括在多线程之间实现锁的等待、线程中实现Sleep、监测线程或进程是否退出等。 阅读详情


Waits until the specified object is in the signaled state or the time-out interval elapses.
【等待,直到指定的对象处于信号状态或超时间隔结束。】
To enter an alertable wait state, use the WaitForSingleObjectEx function. To wait for multiple objects, use the WaitForMultipleObjects.
【要进入可报警的等待状态,请使用WaitForSingleObjectEx函数。要等待多个对象,请使用WaitForMultipleObjects。】

Syntax

DWORD WINAPI WaitForSingleObject(
  __in  HANDLE hHandle,
  __in  DWORD dwMilliseconds
);

Parameters

hHandleA handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section.
【对象的句柄。有关可以指定其句柄的对象类型的列表,请参见下面的备注部分。】
If this handle is closed while the wait is still pending, the function’s behavior is undefined.
【如果此句柄在等待仍挂起时关闭,则函数的行为未定义。】
The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.
【句柄必须具有同步访问权限。有关详细信息,请参阅标准访问权限。】
dwMillisecondsThe time-out interval, in milliseconds. The function returns if the interval elapses, even if the object’s state is nonsignaled. If dwMilliseconds is zero, the function tests the object’s state and returns immediately. If dwMilliseconds is INFINITE, the function’s time-out interval never elapses.
超时间隔,以毫秒为单位。如果间隔已过,则函数返回,即使对象的状态为非信号状态。如果dwmillizes为零,函数将测试对象的状态并立即返回。如果dwms是无限的,则函数的超时时间间隔永远不会过去。

Return Value

If the function succeeds, the return value indicates the event that caused the function to return. It can be one of the following values.
【如果函数成功,则返回值指示导致函数返回的事件。它可以是以下值之一。】

Return code/valueDescription
WAIT_ABANDONED
0x00000080L
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread, and the mutex is set to nonsignaled.
指定的对象是一个互斥对象,在拥有该互斥对象的线程终止之前,该对象没有被拥有该互斥对象的线程释放。互斥对象的所有权被授予调用线程,互斥被设置为nonsignaled。
If the mutex was protecting persistent state information, you should check it for consistency.
如果互斥体是在保护持久状态信息,则应该检查其一致性。
WAIT_OBJECT_0
0x00000000L
The state of the specified object is signaled.
【指定对象的状态被通知。】
WAIT_TIMEOUT
0x00000102L
The time-out interval elapsed, and the object’s state is nonsignaled.
【超时间隔已过,并且对象的状态为非信号状态。】

If the function fails, the return value is WAIT_FAILED ((DWORD)0xFFFFFFFF). To get extended error information, call GetLastError.
如果函数失败,则返回值为WAIT_FAILED ((DWORD)0xFFFFFFFF)。要获取扩展错误信息,请调用GetLastError。

Remarks

The WaitForSingleObject function checks the current state of the specified object. If the object’s state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses.
【WaitForSingleObject函数检查指定对象的当前状态。如果对象的状态为nonsignaled,则调用线程将进入wait状态,直到对象收到信号或超时间隔结束。】

The function modifies the state of some types of synchronization objects. Modification occurs only for the object whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one.
【此函数用于修改某些类型的同步对象的状态。只对其信号状态导致函数返回的对象进行修改。例如,信号量对象的计数减少1。】

The WaitForSingleObject function can wait for the following objects:
【WaitForSingleObject函数可以等待以下对象:】

  • Change notification 【更改通知】
  • Console input 【控制台输入】
  • Event 【事件】
  • Memory resource notification【内存资源通知】
  • Mutex 【互斥量】
  • Process 【进程】
  • Semaphore 【信号量】
  • Thread 【线程】
  • Waitable timer 【可等待的计时器 】

Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. Two examples of code that indirectly creates windows are DDE and the CoInitialize function. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForSingleObject.
【在调用直接或间接创建窗口的等待函数和代码时要小心。如果线程创建任何窗口,它必须处理消息。消息广播发送到系统中的所有窗口。使用无超时间隔的等待函数的线程可能会导致系统死锁。间接创建窗口的两个代码示例是DDE和CoInitialize函数。因此,如果有创建窗口的线程,请使用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx,而不是WaitForSingleObject。】

用法小结

windows C++多线程(二):线程等待WaitForSingleObject与WaitForMultipleObjects 关于线程的状态,各个书籍教材,系统的定义都有细微差别,主要有这几种状态:线程就绪(创建),运行,阻塞,终止等。本篇介绍windows多线程的阻塞等待相关的函数。 一 WaitForSingleObject 函数声明如下 DWORD WINAPI WaitForSingleObject( _In_ HANDLE hHandle, _In_ DWORD dw... 阅读详情

相关推荐

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

MFC 多线程WaitForSingleObject死锁

遇到一种情况,在子线程程中调用了主线程方法,再使用多线程同步的话,会死锁,经过度娘的询问,发现也有朋友遇到同样的问题,于是写了一个测试代码如下: MyMutex g_mutex;//自己封装的Mutex,简单的APi封装 bool g_exit=false; HANDLE g_hThread; UINT DoWork(LPVOID lp) { CMFC_TEST_MULTITHREADDlg

小乌龟的博客 3265

Rocky Linux 9.0国内yum源一键替换指南(上海交大镜像站实测)

本文详细介绍了如何将Rocky Linux 9.0的yum源替换为上海交大镜像站,以解决国内用户访问官方源速度慢的问题。通过实测验证,上海交大镜像站提供高速下载和稳定更新,并提供了完整的替换步骤、常见问题解决方案及高级优化配置,帮助用户提升软件包下载效率。

weixin_29304985的博客 361

MFC 线程同步

使用WaitForSingleObject函数来等待一个内核对象变为已通知状态: DWORD WaitForSingleObject( HANDLE hObject, //指明一个内核对象的句柄 DWORD dwMilliseconds //等待时间 ); 该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。 第二个参数指明了需要等待的时间(毫秒),可以传递IN

weixin_40721097的博客 351

NET 实战:30 天搞定企业级 Web 订餐系统(附完整源码 + 数据库设计)

订餐流程:浏览菜品 → 选择菜品及数量 → 填写送餐地址 → 提交订单 → 数据库记录核心代码(绑定菜品列表):vb' 绑定菜单表到DataGrid控件,展示菜品信息user id=sa;' 查询菜品名称、价格、口味Dim adpt1 As New SqlDataAdapter("select cdishid,vdishname 菜品名称,cdishrate 价格,vdishdescription 口味 from dish", conn)End Sub用户体验优化。

m0_67740236的博客 1517

abb机器人指令手册_ABB机器人配置圆形输送链跟踪

更多内容请点击上方ABB机器人实战技巧关注也可点击公众号下方往期经典浏览更多内容转载请先后台留言,大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言1. 通常的机器人输送链跟踪,均为直线输送链跟踪,例如下图2. 有些情况,输送链为圆形,例如...

weixin_39849894的博客 2044

MFC---多线程(线程同步之事件对象、内核对象与句柄)

事件对象也属于内核对象,它包含以下三个成员:●使用计数;●用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值;●用于指明该事件处于已通知状态还是未通知状态的布尔值。事件对象有两种类型:人工重置的事件对象和自动重置的事件对象。这两种事件对象的区别在于当人工重置的事件对象得到通知时,等待该事件对象的所有线程均变为可调度线程;而当一个自动重置的事件对象得到通知时,等待该事件对象的线程中只有一个线程变为可调度线程。

Frank---7的博客 2621

用「OpenClaw」打造新媒体运营神器:小红书/公众号全自动选题→创作→排版→发布全流程

对于新媒体运营的从业者来说,AI不是要取代运营人员,而是把他们从繁琐的重复劳动中解放出来,专注于更核心的内容策略、用户运营、品牌建设,这才是AI在传统行业落地的真正价值。这是最终输出可发布内容的核心智能体,我们通过「OpenClaw」的Prompt工程,结合不同平台的排版规范,实现了一键生成符合要求的排版,完全替代人工重复劳动。这套系统的落地,不是技术的炫技,而是真正用AI解决了新媒体运营的核心痛点:用自动化替代重复的人工劳动,用数据决策替代经验主义,用全闭环执行替代纸上谈兵的建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 198

MFC两个线程用事件内核对象通信,sleep和waitforsingleobject函数的使用

草稿

效率平和 1194

基于卷积神经网络的球罐结构损伤识别

球罐结构损伤识别方法研究 摘要:本研究针对球形储罐(球罐)结构健康监测需求,提出基于卷积神经网络(CNN)的损伤识别方法。通过ANSYS有限元仿真构建包含5种裂纹深度的500组振动信号数据集,设计包含卷积层、池化层和全连接层的CNN网络架构。实验结果表明,该方法在训练集和测试集上分别达到98.4%和96.0%的准确率,验证了其在球罐焊缝损伤识别中的有效性。研究提供了完整的MATLAB实现代码,为球罐结构智能化监测提供了技术参考。 关键词:球罐结构;卷积神经网络;损伤识别;振动信号;深度学习

AI的内部世界的博客 120

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 362

在MFC中使用WaitForSingleObject出现假死

前几天在编写远控的时候,需要在GUI线程之外创建一和

bobopeng 5074

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

YOLOv11结合OpenCV技术,精准识别和计数鸡蛋与鸡,广泛应用于养殖场、市场监控和自动化包装。通过深度学习与计算机视觉,提升农业生产效率,让智能化管理更简单高效。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 1205

MFC主线程使用WaitForSingleObject阻塞的问题

在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比如SetWindowText,InsertItem,SetItemText这些函数,就有会导致主主线程阻塞问题,看看这段代码。 DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data )

十年磨一剑,霜刃未曾试! 1万+

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

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

Devexpress16.2.6破解工具

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

VC++关于使用WaitForSingleObject等待线程安全退出,出现死机问题的解决

1、MFC项目场景如下: 主线程新建了子线程: CWinThread *m_pThread_SysReset; m_pThread_SysReset=AfxBeginThread(ThreadSysResetthis); 主界面等待子线程退出时,主线程主动调用了函数: WaitForSingleObject(m_pThread_SysReset->m_hThread, INFIN...

$firecat利白的代码足迹$ 6262

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WaitForSingleObject和CEvent用法

WaitForSingleObject和CEvent用法 WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。 CEven...

没有蛀牙lm的博客 1276

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何隐藏system函数的窗口

原]如何隐藏system函数的窗口 修改浏览权限 | 删除 由于一直在写控制台的程序,对于MFC并不是很熟。这次写osg<——>ive格式转换器这个小工具的时候,涉及到使用setlocale函数来设置本地资源,不知道为什么在MFC中无法生效,于是只好写了一个带命令行参数的控制台程序,希望通过MFC这个界面传递参数来使用这个控制台程序。 最先想到的是system函数,因为...

lilisalo 81

【C++】WaitForSingleObject函数的使用&&WaitForSingleObject和CEvent用法

WaitForSingleObject 当指定的对象处于有信号状态或者等待时间结束的状态时,此函数返回。 DWORD WaitForSingleObject(   HANDLE hHandle,   DWORD dwMilliseconds ); 参数:  hHandle:指定对象或事件的句柄;  dwMilliseconds: 等待时间,以毫妙为单位,当超过等待时间时,此函数将返

ly930156123的博客 5756

MFC-线程 WaitForSingleObject 和 WaitForMultipleObjects

//用于单个(共2个参数) //等待通知INFINITE无限时间 0立即,1000是1秒 if ((wr = WaitForSingleObject(hThread, INFINITE)) == WAIT_FAILED) { puts("thread wait error"); return -1; } //用于多个及单个(共4个参数 ) WaitForMultipleObject...

qq_42914451的博客 635

MFC 定时器之妙用

现在有这么一个问题,在VC编程中,如果要每隔一段时间去响应一个事件,应该怎么处理? 1.Sleep(int n)函数;(S 一定要大写,这个和C不一样) 2.WaitForSingleObject()等待函数; 其中,用Sleep()多的话应该知道,它的时间不是很精确,且会让程序陷入休眠,而且这个函数其实是VC专门为线程设计的。而等待函数是需要SetEvent来...

黑暗世界的自由 319

MFC主线程使用WaitForSingleObject阻塞的问题 http://blog.youkuaiyun.com/sysprogram/article/details/17383455

MFC主线程使用WaitForSingleObject阻塞的问题 2013-12-17 21:10 2339人阅读 评论(1) 收藏 举报  分类: VC/MFC(125)  版权声明:本文为博主原创文章,未经博主允许不得转载。 在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比

诺尔曼 2167

关于MFC中工作线程如何正常退出

当你创建工作线程CWinThread *pSndTread = AfxBeginThread(fun,param); 如果你设置 pSndTread->m_bAutoDelete = FALSE;则需要你在线程结束后,要手动delete 掉 pSndTread对象; 如果你不设置m_bAutoDelete的话,则需要保证线程中始终在任何情况下都能执行 return 0;语句返回,因为这样不但可

bodogbo11的专栏 8274

MFC 线程的暂停与继续,请问如何做啊。新手

MFC 线程的暂停与继续,请问如何做啊。新手。新建线程hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Test,NULL,0,&ThreadID);用WaitForSingleObject( hThread, INFINITE );使它暂停了。请问如何让它重新开始运行。先谢谢了。答: 你好,一般情况下线程的暂停应该是这样的。1.创建线程hT

学海无涯 2740

MFC线程等待不是使用sleep

因为MFC线程里面的sleep时候,是整体程序都停止下来,所以需要一个只是让当前的线程等待,其他的地方都是正常运行 1、创建全局变量 HANDLE g_event = CreateEvent(NULL,TRUE,FALSE,NULL); 2、线程里面最后写上等待 WaitForSingleObject(g_event,2000); 2000是毫秒,等待2000毫秒后继续执行 ...

qq_40544338的博客 3404

人脸识别--MFC下调用caffe做人脸识别

MFC下的人脸识别工程实现

syhxsqq123的博客 1927
上一篇: MFC CBitmap::CreateBitmap()
下一篇: MFC WaitForMultipleObjects 函数
sty_app
博客等级 码龄12年 9粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值