WaitForSingleObject(m_hEvent,INFINITE) ;

WaitForSingleObject(m_hEvent, INFINITE) 函數用於停止一個指定的執行緒,直到有信號量或信號通知接收。

m_hEvent 是一個句柄,指向一個事件對象,它可以是由 CreateEvent、OpenEvent 或其他函數創建的。

INFINITE 常量定義為 0xFFFFFFFF,表示無限等待。也就是說,執行緒將一直等待直到有信號量或信號通知接收,並且不會超時返回。

簡而言之,WaitForSingleObject(m_hEvent, INFINITE) 函數讓當前執行緒暫停,直到有信號量或信號通知接收為止


如何使用?

使用 WaitForSingleObject(m_hEvent, INFINITE) 函數的基本步驟如下:

  1. 在執行緒中創建或打開事件對象。可以使用 CreateEvent、OpenEvent 或其他函數創建或打開事件對象。例如:                                                                                                          HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("MyEvent"));
  2. 在執行緒中調用 WaitForSingleObject(hEvent, INFINITE) 函數。例如:
  3. WaitForSingleObject(hEvent, INFINITE);
  4. 在另一個執行緒或程序中發送信號量或信號通知給事件對象。可以使用 SetEvent、PulseEvent 或其他函數發送信號量或信號通知。例如:
  5. SetEvent(hEvent);
  6. 在第 3 步中發送信號量或信號通知後,WaitForSingleObject(hEvent, INFINITE) 函數將返回,執行緒將恢復執行。

注意:請務必在不再使用事件對象時記得關閉它。例如:

CloseHandle(hEvent);


简单范例:

#include <windows.h>
#include <iostream>using namespace std;HANDLE hEvent;// 執行緒函數
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{cout << "Thread started. Waiting for event..." << endl;// 等待事件WaitForSingleObject(hEvent, INFINITE);cout << "Event received. Exiting thread..." << endl;return 0;
}int main()
{// 創建事件hEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("MyEvent"));// 創建執行緒HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);cout << "Press Enter to send event..." << endl;cin.get();// 發送事件SetEvent(hEvent);// 等待執行緒結束WaitForSingleObject(hThread, INFINITE);// 關閉事件和執行緒句柄CloseHandle(hEvent);CloseHandle(hThread);return 0;
}

執行結果如下:

Press Enter to send event...
Thread started. Waiting for event...
Event received. Exiting thread...

在上面的範例中,主程序創建了一個事件對象,並創建了一個執行緒。在執行緒中,調用了 WaitForSingleObject(hEvent, INFINITE) 函數,執行緒暫停執行,等待事件。在主程序中,使用 SetEvent(hEvent) 函数發送事件,執行緒恢復執行,然後結束。


总结:

在使用 WaitForSingleObject(m_hEvent, INFINITE) 函數時,還有一些需要注意的地方。

  • 事件對象必須先創建或打開,才能使用 WaitForSingleObject 函數等待。
  • 在發送信號量或信號通知時,必須確保事件對象已被打開。
  • 如果執行緒需要在多個事件對象之中進行等待,可以使用 WaitForMultipleObjects 函數。
  • 如果需要在超時指定的時間內等待,可以使用 WaitForSingleObject(m_hEvent, dwMilliseconds) 函數。其中 dwMilliseconds 是等待的毫秒數。
  • 如果執行緒需要等待的事件對象並不存在,WaitForSingleObject 函數將返回 WAIT_FAILED,並設置錯誤碼為 ERROR_INVALID_HANDLE。
  • 如果需要等待的事件對象已經被關閉,WaitForSingleObject 函數將返回 WAIT_ABANDONED,並設置錯誤碼為 ERROR_INVALID_HANDLE。

C++ 多线程: WaitForSingleObject(m_hEvent,INFINITE) ;相关推荐

  1. MFC多线程 信号量CSemaphore 临界区与互斥 事件

    CMutex, CCriticalSection用于对资源的互斥访问. CMutex可以跨进程使用, CCriticalSection只可以在进程内部使用. 创建CMutex需要更多的资源,只用于进程 ...

  2. 一种利用ADO连接池操作MySQL的解决方案(VC++)

    VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连 ...

  3. windows 线程一般用法

    目录 一.  线程说明 1. 概念 2. 线程与进程 3. 执行 二.  windows下的各种线程 1. win32线程 (1) CreateThread (2) _beginthreadex (3 ...

  4. 多进程event通信

    2019独角兽企业重金招聘Python工程师标准>>> #include "stdafx.h" #include <Windows.h>int mai ...

  5. WinCE的USB驱动开发

    USB协议 http://www.usb.org/ Windows CE.NET 的USB系统软件分为两层: USB Client设备驱动程序和底层的Windows CE实现的函数层.USB设备驱动程 ...

  6. 内核层与应用层通信详解

    做驱动开发的肯定会遇到应用层与内核层的通信的问题,首先说内核层与应用层的通信可以大概分为两个方面,第一是应用层向内核层主动传递消息,第二是内核层主动与应用层通信.下面我们将分开来谈两个方面. 我们先来 ...

  7. 多线程编程(9) - 认识等待函数 WaitForSingleObject

    一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex.Semaphore.Event.WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 W ...

  8. 多线程编程(1) - 认识等待函数 WaitForSingleObject

    function WaitForSingleObject(hHandle: THandle; {要等待的对象句柄}dwMilliseconds: DWORD {等待的时间, 单位是毫秒} ): DWO ...

  9. 多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来实现线程同步

    这几天忙着写一个实现basler相机的采集功能的软件,其实无非也就是看文档,调用他提供的接口. 但在这其中出现了一点小问题,我写了一个子进程,但每次使用全局标识符关闭子进程,主进程都会出现错误,提示捕 ...

最新文章

  1. 9.8.6恢复系统数据库
  2. ES5 数组方法forEach
  3. RxJava初入学习(一)之Gifts-for-designers
  4. mysql中index的作用,在mysql中使用INDEXES有什么好处?
  5. 黄聪: bootstrap 多模态框实现
  6. SAP Spartacus的persist focus,触发map set的条件
  7. oracle的打开图标,Oracle的SQL Developer 在Ubuntu上以图标显示且双击能运行
  8. nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】
  9. Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
  10. 处理iPhone5加长屏幕的4种方法
  11. 一维信号小波阈值去噪 c语言,一维信号小波阈值去噪
  12. 构建可网管的企业网络
  13. ajax基本概念,方法
  14. 我的世界服务器被踢会显示什么,我的世界:500人被踢,服务器“假死”,2b2t的附魔台成掉线之王...
  15. 爬虫初识(爬取dytt电影列表及下载地址)
  16. Calander用例
  17. 计算网格中直线经过的格子
  18. 基于SLAM的机器人导航避障方案
  19. 做一个快乐的程序员,去感受爱
  20. base64编码解码方法

热门文章

  1. Visual Studio 滚动条略缩图设置
  2. 北京喜意来一支被豪门骗子出卖被迫北漂的足球队
  3. 人工智能的认识论问题
  4. metasploit实战-ms17-010(永恒之蓝)漏洞利用与复现
  5. 安卓离线下载V7兼容包存在,但是无法import android.support.v7.app.AppCompatActivity
  6. JavaScript扩展运算符
  7. python 中 map函数的用法(超详细)
  8. 教你实现一个天气实时查询微信小程序
  9. 储存卡数据怎么恢复?很实用的方法!
  10. 区块链技术与法律不是敌对双方,而是并肩战友