一:介绍

事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态。分两种类型:手动处置事件和自动处置事件。
手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到把它设置为未激发状态。
自动处置事件被设置为激发状态后,会唤醒一个等待中的线程,然后会自动设置成未激发状态。

二:函数说明

创建事件对象:
    HANDLE CreateEvent
    (
      LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
      BOOL bManualReset,     // 指定将事件对象创建成手动复原还是自动复原,true:手动事件;false:自动事件
      BOOL bInitialState, // 初始状态,true:有信号状态; false:无信号状态
      LPCTSTR lpName         // 事件对象名称
    );

获得事件对象:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    }

触发事件:
    BOOL SetEvent(HANDLEhEvent)
    
将事件设置成未触发:
    BOOL ResetEvent(HANDLEhEvent);

三:步骤

自动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, FALSE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置事件对象:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)

手动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, TRUE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置为未激活:ResetEvent(hEvent)
5.重置为激活态:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)

四:自动处置事件代码实现

 /********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Email: wangpengfei.201@163.com
Created: 2018/10/23
Description: 线程同步-事件
********************************************************/
#include <iostream>
#include <Windows.h> using namespace std; volatile int number = ;
HANDLE hEvent; DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread1:" << number++ << endl;
SetEvent(hEvent);
if (number >= )
{
break;
} }
return ;
} DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread2:" << number++ << endl;
SetEvent(hEvent);
if (number >= )
{
break;
}
}
return ;
} int main()
{
//创建自动事件
hEvent = CreateEvent(NULL, false, true, NULL); CreateThread(NULL, , ThreadFun1, NULL, , NULL);
CreateThread(NULL, , ThreadFun2, NULL, , NULL); getchar();
return ;
}

扫码关注公众号

专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

最新文章

  1. (转载) 利用国内的镜像,加速PIP下载
  2. 面试中常问的有关随机选取k个数的总结
  3. SharePoint 2013 内容部署报错
  4. Java对文件中的对象进行存取
  5. 服务器控件和 viewstate
  6. VG.net矢量图和矢量动画开发平台拓扑图软件免费下载
  7. Ora-01536:超出了表空间users的空间限量(转)
  8. [Flex] as3xls读取excel,修改保存单表(二)
  9. 【转】istringstream、ostringstream、stringstream 类介绍 .
  10. 一、mysql使用入门
  11. Linux下如何在打开终端的时候自动配置相关环境
  12. 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm
  13. 关于C# json转object时报错:XXXXXXXXXX需要标记“&quot;”,但找到“XX”。
  14. BCB/Delphi中常用的VCL函数说明(字符串函数)
  15. dedecms标签大全
  16. iOS关闭键盘的两种简单方法
  17. CVE-2018-8120 Microsoft Windows提权漏洞 Exp
  18. python爬取某站上海租房图片
  19. 如何用java实现一个p2p种子搜索(1)-概念
  20. Jmeter-----图形扩展监控

热门文章

  1. Django-项目上线后,静态文件配置失效以及404、500页面的全局配置
  2. [.net 多线程]SpinWait
  3. vs2017安装后自动应用许可证
  4. OC自定义文档头部注释
  5. Tomcat类加载机制触发的Too many open files问题分析(转)
  6. bit、Byte、bps、Bps、pps、Gbps的单位的说明及换算
  7. [llvm] LLVM 核心类简明示例 : llvm::Value &amp;&amp; llvm::Type &amp;&amp; llvm::Constant
  8. 《Andrew Ng深度学习》笔记5
  9. django form tips
  10. 导出table为Excel