CEvent类及常用函数

来源:百度文库 编辑:神马文学网 时间:2024/05/16 02:01:50

CEvent类

CEvent类的一个对象,表示一个“事件”---- 一个允许一个事件发生时线程通知另一个线程的同步对象。在一个线程需要了解何时执行任务时,事件是十分有用的。例如,拷贝数据到数据文档时,线程应被通知何时数据是可用的。当新数据可用时,通过运用CEvent对象来通知拷贝线程,线程才可能尽快地执行。

CEvent对象有两种类型:自动和手工。一个手工CEvent对象存在于由ResetEvent 或SetEvent设置的状态中,直到另一个函数被调用。一个自动CEvent对象在至少一个线程被释放后自动返回一个无标记(无用的)状态。

1.   CreateEvent()用于创建或打开一个命名的或无名的事件对象。函数原型是:

       HANDLE CreateEvent(

  LPSECURITY_ATTRIBUTESlpEventAttributes, // 安全属性

  BOOL bManualReset,// 复位方式

  BOOL bInitialState,// 初始状态 TRUE or FALSE

  LPCTSTR lpName // 对象名称

  );

 

2.    ResetEvent():这个函数把指定的事件对象设置为无信号状态。函数原型是:

  BOOL ResetEvent(

  HANDLE hEvent

  );

参数说明:

  hEvent

  [in] 指向事件对象的句柄.由 CreateEvent or OpenEvent 函数返回。 这个句柄需要拥有EVENT_MODIFY_STATE访问权限.

  函数成功,返回非0值,否则返回0值,可以调用GetLastError得到错误的详细信息。

  Remarks

  一个事件对象一直都保持在无信号状态,直到显式调用 SetEvent or PulseEvent 函数把它设置到有信号状态。 这些无信号的事件对象会阻塞任何在内部调用wait函数的线程。

  这个函数用于手动重置的事件对象。手动重置的对象在线程释放后必须手动置为无信号状态。 自动重置的事件对象在一个等待它成功的线程释放后会自动变为无信号状态。

  重置一个无信号的事件对象没有任何效果。

 

3.    WaitForSingleObject():用来检测hHandle事件的信号状态。函数原型是:

  DWORDWaitForSingleObject(

  HANDLE hHandle,

  DWORDdwMilliseconds

  );

  参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

4.    CloseHandle():关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。函数原型为:

BOOL CloseHandle(

  HANDLE hObject

  );

  参数

  hObject :代表一个已打开对象handle。

  返回值

  TRUE:执行成功;

  FALSE:执行失败,可以调用GetLastError()获知失败原因。

 

其他:

一个Event被创建以后,可以用OpenEvent()API来获得它的Handle,用CloseHandle()  来关闭它,用SetEvent()或PulseEvent()来设置它使其有信号,用ResetEvent()来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号。

PulseEvent()是一个比较有意思的使用方法,正如这个API的名字,它使一个Event 对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的。

以上都是我总结的,参考百度百科。