SetEvent()和ResetEvent()
一、综述:
SetEvent()使当前事件对象处于有信号状态,当前的这个线程可以继续执行。
ResetEvent()是当前事件对象处于无信号状态,当前的线程处于睡眠状态,不能执行。
设置为TRUE就是有信号状态CreateEvent(,,TRUE,) = CreateEvent(,,FALSE,) + SetEvent()
CreateEvent(,,TRUE,):是设置事件对象的起始状态为有信号;
CreateEvent(,,FALSE,) :是设置事件对象的起始状态为无信号;
SetEvent():手动设置事件对象的状态为有信号 。
二、详细介绍:
SetEvent()设置事件为有信号状态时,线程就执行完毕了!!
BOOL SetEvent(HANDLE hEvent);
其中hEvent表示句柄,返回值:如果操作成功,则返回非零值,否则为0。
说明
设置事件的状态为有标记,释放任意等待线程。
如果事件是手工的,此事件将保持有标记直到调用ResetEvent,这种情况下将释放多个线程;
如果事件是自动的,此事件将保持有标记,直到一个线程被释放,系统将设置事件的状态为无标记;
如果没有线程在等待,则此事件将保持有标记,直到一个线程被释放。
用法
线程中SetEvent及WaitForSingleObject用法
SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。
WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。 当你创建一个线程时,其实那个线程是一个循环,不像上面那样只运行一次的。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用WaitForSingleObject函数来检查事件是否满足,如果满足就退出线程,不满足就继续运行。当在线程里运行阻塞的函数时,就需要在退出线程时,先要把阻塞状态变成非阻塞状态,比如使用一个线程去接收网络数据, [1] 同时使用阻塞的SOCKET时,那么要先关闭SOCKET,再发送事件信号,才可以退出线程的。
当然我感觉重要应用方面还是用来锁定,实现所谓的pv功能。
在调用的过程中,所有线程都可以在一个等待函数中指定事件对象句柄。当指定的对象的状态被置为有信号状态时,单对象等待函数将返回。
对于多对象等待函数,可以指定为任意或所有指定的对象被置为有信号状态。当等待函数返回时,等待线程将被释放去继续运行。
初始状态在bInitialState参数中进行设置。使用SetEvent函数将事件对象的状态置为有信号状态。使用ResetEvent函数将事件对象的状态置为无信号状态。
当一个手动复原的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至明确调用ResetEvent函数将其置为无符号状态。
当事件的对象被置为有信号状态时,任意数量的等待中线程,以及随后开始等待的线程均会被释放。
当一个自动复原的事件对象的状态被置为有信号状态时,该对象状态将一直保持有信号状态,直至一个等待线程被释放;系统将自动将此函数置为无符号状态。如果没有等待线程正在等待,事件对象的状态将保持有信号状态。
多个进程可持有同一个事件对象的多个句柄,可以通过使用此对象来实现进程间的同步。下面的对象共享机制是可行的:
·在CreateEvent函数中,lpEventAttributes参数指定句柄可被继承时,通过CreateProcess函数创建的子进程继承的事件对象句柄。
·一个进程可以在DuplicateHandle函数中指定事件对象句柄,从而获得一个复制的句柄,此句柄可以被其它进程使用。
·一个进程可以在OpenEvent或CreateEvent函数中指定一个名字,从而获得一个有名的事件对象句柄。
使用CloseHandle函数关闭句柄。当进程停止时,系统将自动关闭句柄。当最后一个句柄被关闭后,事件对象将被销毁。
SetEvent()和ResetEvent()相关推荐
- c++中SetEvent和ResetEvent的使用
关于事件 事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false).根据状态变迁方式的不同 ...
- Windows编程之CreateEvent,WaitForSingleObject,SetEvent,ResetEvent函数
一 Windows编程之CreateEvent,WaitForSingleObject,SetEvent,ResetEvent函数 1 CreateEvent HANDLE WINAPI Create ...
- SetEvent与ResetEvent
事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false).根据状态变迁方式的不同,事件可分 ...
- windows线程 事件CreateEvent、SetEvent、ResetEvent、CloseHandle
事件 相关问题 程序之前的通知的问题 事件的使用 1.创建事件 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,//事件安全属性 ...
- 线程中CreateEvent和SetEvent和ReSetEvent及WaitForSingleObject的用法
概述 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号 ...
- SetEvent,ResetEvent
BOOL CEvent::SetEvent(); 将 CEvent 类对象的状态设置为有信号状态.如果事件是人工事件,则 CEvent 类对象保持为有信号状态,直到调用成员函数ResetEvent() ...
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号",否则称为"无信号".可以在一个线程的执行函 ...
- C++事件的建立和使用SetEvent,ResetEvent
一.事件是很常用的多线程同步互斥机制 函数原型如下所示,一共四个参数: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // ...
- C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
目录 windows使用CreateEvent.SetEvent.ResetEvent.WaitForSingleObject linux使用sem_init.sem_wait.sem_trywait ...
最新文章
- JVM:垃圾回收概述
- 我的第一个appium+Python自动化实例
- 什么叫系统的可扩展性?
- 【计算机网络】网络层 : ARP 协议 ( 使用 ARP 协议查找 目的主机 / 路由器 物理地址 )★
- php基础教程文档,PHP5基础教程
- undertow服务器分析_进入Undertow Web服务器
- php excel 垂直居中,完美实现文字图片水平垂直居中
- 爬虫-练习引导-豆办电影爬取-json数据的处理
- MinIO Docker 快速入门 ​​​​​​​
- java对焦_【Camera】手机相机自动对焦的3种方式及原理
- 微服务注册中心为什么要使用Consul替代Eureka?
- linux下的备份管理rsync
- 支付宝 支付宝扫描生成的二维码提示:码已失效,请刷新二维码后重试
- matlab数值微积分与方程数值求解,六、数值微积分与方程求解(MATLAB学习笔记)
- 游戏关卡设计理论普及
- java mpeg ps转mpeg-4_MPEG4格式转换器下载_枫叶MPEG4格式转换器(MPEG转换器) 9.0.5.0 共享版_极速下载站...
- C++ - priority_queue
- [日推荐]『车主码』解决临时停车、请人挪车的小麻烦
- biu Vue2高级知识点
- 新物联网!新电商平台!