事件EVENT与waitforsingleobject的使用
2024-08-28 00:21:18
事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警。
event的几个函数:
1、CreateEvent和OpenEvent
HANDLE WINAPI CreateEvent(
__in LPSECURITY_ATTRIBUTES lpEventAttributes, //表示安全控制,一般直接传入NULL,表示不能被子进程继承
__in BOOL bManualReset, //参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。
__in BOOL bInitialState, //Event的初始状态, TRUE为触发,FALSE未触发
__in LPCTSTR lpName //Event object的名字,NULL表示没名字(without a name)
);
要是CreateEvent创建的事件没名字 这个函数就没啥用了,不多做介绍,可查看msn。
1 HANDLE WINAPI OpenEvent( //获得已经存在的Event的事件句柄
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in LPCTSTR lpName //要打开的事件名字
);
2、SetEvent,触发事件
BOOL SetEvent(HANDLE hEvent);
3、ResetEvent,使事件状态设为未触发,如在创建事件时第二个参数为TRUE手动设置,则需要该函数去恢复事件为未触发状态。
BOOL SetEvent(HANDLE hEvent);
4、PulseEvent, 如在创建事件时第二个参数为TRUE手动设置,其功能相当于SetEvent()后立即调用ResetEvent(),最好别用
BOOL PulseEvent(HANDLE hEvent)
5、CloseHandle(),关闭该句柄。
**********
WaitForSingleObject函数。使线程处于等待状态,如等待某一事件的触发。
DWORD WINAPI WaitForSingleObject( HANDLE hHandle, //等待的触发句柄 , 如前面说的Event的句柄
DWORD dwMilliseconds //等待多长时间,单位ms 如5000 则为5s 若为INFINITE表示无限等待 );
******************
一种应用的例子:
BOOL CMainDlg::OnInitDialog()
{
CDialog::OnInitDialog(); m_handle = CreateEvent(NULL,FALSE,FALSE,NULL); //自动复位事件状态,初始状态未触发 return TRUE;
}
//线程1函数
{
....
SetEvent(m_handle); //触发事件
}
//线程2函数
{
......
WaitForSingleObject(m_handle,INFINITE); //无限等待 事件的触发才会执行后续程序
...........
}
最后,事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。
最新文章
- sql left join、right join、inner join
- C# string 数组 每个元素 加上单引号,每一个都被包含在单引号内
- http://blog.csdn.net/hguisu/article/details/7533759
- python27+django调用数据库
- mvc api odata 查询选项之 $inlinecount ,$format 选项
- 《JavaScript语言精髓与编程实践》读书笔记一
- MySQL UPDATE
- [LA] 3644 - X-Plosives [并查集]
- C#中的委托和游戏中的运用
- 工作随笔——自动重发的凶手--feign
- elasticsearch2.3.3安装
- UNIX网络编程——非阻塞connect:时间获取客户程序
- 关于HTTPS的简要内容
- vs2017激活码
- c# sqlite 数据库加密
- Matlab——GUI初涉
- Angular2 *ngFor把数据显示在多个input中出错解决方法
- delphi中sql实现while循环插入,不存在则插入
- 【Java】方法的重载与重写
- guacamole实现剪切复制
热门文章
- 【.net 深呼吸】细说CodeDom(3):命名空间
- EntityFramework Core 1.1是如何创建DbContext实例的呢?
- virtualbox linux虚拟机相关
- mybatis plugins实现项目【全局】读写分离
- [原] 利用 OVS 建立 VxLAN 虚拟网络实验
- Autofac - MVC/WebApi中的应用
- C#使用GET、POST请求获取结果
- NGINX引入线程池 性能提升9倍
- 为什么 Android Studio 工程文件夹占用空间这么大?我们来给它减减肥
- 第11章 Linux服务管理