事件EVENT与waitforsingleobject的使用

事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警。

event的几个函数:

1、CreateEvent和OpenEvent

1 HANDLE WINAPI CreateEvent(
2   __in          LPSECURITY_ATTRIBUTES lpEventAttributes,    //表示安全控制,一般直接传入NULL,表示不能被子进程继承
3   __in          BOOL bManualReset,  //参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动置位。
4   __in          BOOL bInitialState,  //Event的初始状态, TRUE为触发,FALSE未触发
5   __in          LPCTSTR lpName   //Event object的名字,NULL表示没名字(without a name)
6 );

要是CreateEvent创建的事件没名字  这个函数就没啥用了,不多做介绍,可查看msn。
1
HANDLE WINAPI OpenEvent( //获得已经存在的Event的事件句柄 2 __in DWORD dwDesiredAccess, 3 __in BOOL bInheritHandle, 4 __in LPCTSTR lpName //要打开的事件名字 5 );

2、SetEvent,触发事件

1 BOOL SetEvent(HANDLE hEvent);

3、ResetEvent,使事件状态设为未触发,如在创建事件时第二个参数为TRUE手动设置,则需要该函数去恢复事件为未触发状态。

BOOL SetEvent(HANDLE hEvent);

4、PulseEvent, 如在创建事件时第二个参数为TRUE手动设置,其功能相当于SetEvent()后立即调用ResetEvent(),最好别用

1 BOOL PulseEvent(HANDLE hEvent)

5、CloseHandle(),关闭该句柄。

**********

WaitForSingleObject函数。使线程处于等待状态,如等待某一事件的触发。

1 DWORD WINAPI WaitForSingleObject(
2 
3   HANDLE hHandle,                   //等待的触发句柄  ,  如前面说的Event的句柄
4 5 DWORD dwMilliseconds //等待多长时间,单位ms 如5000 则为5s 若为INFINITE表示无限等待 6 7 );

******************

一种应用的例子:

 1 BOOL CMainDlg::OnInitDialog()
 2 {
 3     CDialog::OnInitDialog();
 4 
 5     m_handle = CreateEvent(NULL,FALSE,FALSE,NULL);  //自动复位事件状态,初始状态未触发
 6 
 7     return TRUE;  
 8 }
 9 //线程1函数
10 {
11    ....
12    SetEvent(m_handle);       //触发事件
13 }
14 //线程2函数
15 {
16     ......
17    WaitForSingleObject(m_handle,INFINITE);  //无限等待 事件的触发才会执行后续程序
18    ...........
19 }

最后,事件是内核对象,事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。

转载于:https://www.cnblogs.com/LouMengzhao/p/6076368.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值