C++事件的建立和使用SetEvent,ResetEvent
2015-12-24 15:52
393 查看
一、事件是很常用的多线程同步互斥机制
函数原型如下所示,一共四个参数:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
BOOL bManualReset, // 手动/自动
// TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
// FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
BOOL bInitialState, //初始状态,FALSE为无信号,TRUE为有信号
LPCTSTR lpName //事件的名称
);
二、下面是使用演示:
1、首先在要使用时间的类中声明这个事件的句柄,用来标识这个事件,如下所示:
![](http://img.blog.csdn.net/20151224153704189?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2、声明好了句柄,就要调用CreateEvent()函数创建事件了,如下所示:
![](http://img.blog.csdn.net/20151224153906114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3、设置信号的初始状态,使用SetEvent()(激活状态)或者ResetEvent()(未激活状态),依据使用设置,这里是Set如下所示:
![](http://img.blog.csdn.net/20151224154308485?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4、在函数中检测事件的状态,如下所示在循环中检测事件的状态,如果事件未被激活,循环将会被挂起在这里,不会往下执行,除非在别处调用了SetEvent()或者ResetEvent(),这里是事件被激活之后才会往下执行:
![](http://img.blog.csdn.net/20151224154621775?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151224155033288?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5、执行完成之后调用ResetEvent()将事件状态还原(如果创建事件的时候是手动设置的话)。
函数原型如下所示,一共四个参数:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
BOOL bManualReset, // 手动/自动
// TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
// FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
BOOL bInitialState, //初始状态,FALSE为无信号,TRUE为有信号
LPCTSTR lpName //事件的名称
);
二、下面是使用演示:
1、首先在要使用时间的类中声明这个事件的句柄,用来标识这个事件,如下所示:
2、声明好了句柄,就要调用CreateEvent()函数创建事件了,如下所示:
3、设置信号的初始状态,使用SetEvent()(激活状态)或者ResetEvent()(未激活状态),依据使用设置,这里是Set如下所示:
4、在函数中检测事件的状态,如下所示在循环中检测事件的状态,如果事件未被激活,循环将会被挂起在这里,不会往下执行,除非在别处调用了SetEvent()或者ResetEvent(),这里是事件被激活之后才会往下执行:
5、执行完成之后调用ResetEvent()将事件状态还原(如果创建事件的时候是手动设置的话)。
相关文章推荐
- 用C++11进行多线程开发
- c++中关于hash_map自定义equal function和hash function
- 【学习笔记】关于输入缓冲区。一个不规范的字符赋值语句引发的讨论
- VC++如何判断当前操作系统是32位还是64位?
- VC++实现恢复SSDT
- VC++程序中用PlaySound函数加入自定义声音
- C++小题(二)
- OC语言 内存管理
- c语言中的rand()函数和srand()函数产生随机的整数 (转载)
- C++类型转换详解--const_cast
- C++ Primer Plus 第六版(中文版)课后编程题----第四章
- c/c++ ,gettext,软件的多语言支持(i18n)
- Effective C++(条款5-12)
- C++ 同名隐藏、覆盖,虚函数 的详解和对比
- 筛法与素数
- C#调用 C++的DLL
- 内联函数的effective C++解释
- C语言学习笔记--------伊能C语言学习笔记------C语言结构体字节对齐机制
- 用C语言判断象限
- C语言中通过分隔符来截取字符串