事件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()来发出一个事件脉冲。

最新文章

  1. sql left join、right join、inner join
  2. C# string 数组 每个元素 加上单引号,每一个都被包含在单引号内
  3. http://blog.csdn.net/hguisu/article/details/7533759
  4. python27+django调用数据库
  5. mvc api odata 查询选项之 $inlinecount ,$format 选项
  6. 《JavaScript语言精髓与编程实践》读书笔记一
  7. MySQL UPDATE
  8. [LA] 3644 - X-Plosives [并查集]
  9. C#中的委托和游戏中的运用
  10. 工作随笔——自动重发的凶手--feign
  11. elasticsearch2.3.3安装
  12. UNIX网络编程——非阻塞connect:时间获取客户程序
  13. 关于HTTPS的简要内容
  14. vs2017激活码
  15. c# sqlite 数据库加密
  16. Matlab——GUI初涉
  17. Angular2 *ngFor把数据显示在多个input中出错解决方法
  18. delphi中sql实现while循环插入,不存在则插入
  19. 【Java】方法的重载与重写
  20. guacamole实现剪切复制

热门文章

  1. 【.net 深呼吸】细说CodeDom(3):命名空间
  2. EntityFramework Core 1.1是如何创建DbContext实例的呢?
  3. virtualbox linux虚拟机相关
  4. mybatis plugins实现项目【全局】读写分离
  5. [原] 利用 OVS 建立 VxLAN 虚拟网络实验
  6. Autofac - MVC/WebApi中的应用
  7. C#使用GET、POST请求获取结果
  8. NGINX引入线程池 性能提升9倍
  9. 为什么 Android Studio 工程文件夹占用空间这么大?我们来给它减减肥
  10. 第11章 Linux服务管理