event与WaitForSingleObject、MsgWaitForMultipleObjects等

  线程一般是死循环,需要一些条件来退出或者执行某些操作,event做这种条件就很合适了。

  1、CreateEvent:创建一个命名或者无名的事件对象,函数定义:

  HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL bManualReset,
  BOOL bInitialState,
  LPTSTR lpName);

  lpEventAttributes:忽略,必须是NULL;

  bManualReset:指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。

  bInitialState:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

  lpName:事件对象的名称,如果是NULL,表示无名事件对象。

  2、SetEvent和ResetEvent:将事件设置为发信号与不发信号状态。

  BOOL SetEvent(
  HANDLE hEvent );

  BOOL ResetEvent(
  HANDLE hEvent );

  hEvent:事件对象句柄。

  3、PulseEvent:使一个事件对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的。

  BOOL PulseEvent(
  HANDLE hEvent );

  hEvent:事件对象句柄。

  4、WaitForSingleObject:等待(阻塞),直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。
   DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds );

  hHandle:对象句柄,如事件对象的句柄。

  dwMilliseconds:指定超时毫秒数,如果是0,函数测试对象状态就立马返回,如果是INFINITE,函数永不超时。

  返回值:

  WAIT_ABANDONED:指定的对象是一个互斥对象,该对象没有被拥有该对象的线程在线程结束前释放。互斥对象的所有权被同意授予调用该函数的线程。互斥对象被设置成为无信号状态。

  WAIT_OBJECT_0:核心对象已被激活。

  WAIT_TIMEOUT:等待超时。

  WAIT_FAILED:出现错误,可以通过GetLastError得到错误码。

  5、MsgWaitForMultipleObjects:当对象中的某个或者系列对象处于信号状态时返回,或者规定时间已过也返回。

  DWORD MsgWaitForMultipleObjects(
  DWORD nCount,
  LPHANDLE pHandles,
  BOOL fWaitAll,
  DWORD dwMilliseconds,
  DWORD dwWakeMask );

  nCount:句柄个数。

  pHandles:句柄数组。

  fWaitAll:是否等待所有的handles被激发才返回。

  dwMilliseconds:超时时间。

  dwWakeMask:欲观察的用户输入消息类型

  6、常规用法:先创建事件对象CreateEvent,然后在线程中WaitForSingleObject或者MsgWaitForMultipleObjects,然后在适当的时候SetEvent。

 

 

posted @ 2013-03-29 00:20  抱月听风  阅读(817)  评论(0编辑  收藏  举报