CreateEvent、setevent、ResetEvent和WaitForSingleObject

(1)CreateEvent
函数原型:

HANDLE CreateEvent(   
    LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性   
    BOOL bManualReset, // 复位方式   
    BOOL bInitialState, // 初始状态   
    LPCTSTR lpName // 对象名称   
); 
      lpEventAttributes:一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
      bManualReset:指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么就算等待线程处理了,必须用ResetEvent函数来手工才能将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程处理并释放以后,系统会自动将事件状态复原为无信号状态。所以两者可用于不同的场合,自动复位的需要每次的事件信号才会执行,而手动复位的则可以一直运行。
      bInitialState:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
lpName:指定事件的对象的名称,是一个以0结束的字符串指针。名字是对大小写敏感的。如果lpName为NULL,将创建一个无名的事件对象。
      示例代码:// 创建一个有名的,不能被继承的,手动复原,初始状态是无信号状态的事件对象:
Handle h = CreateEvent(NULL,TRUE,FALSE,“MyEvent”);

(2)SetEvent

函数原型:
BOOL WINAPI SetEvent(
      __in  HANDLE hEvent
);
设置事件的状态为有标记。如果事件创建时是手工的,此事件将保持有标记直到调用ResetEvent。如果事件是自动的,此事件将保持有标记,直到一个线程被释放,系统将设置事件的状态为无标记。

(3)ResetEvent

函数原型:
BOOL ResetEvent(   
     HANDLE hEvent   
);
hEvent 指向事件对象的句柄,由 CreateEvent or OpenEvent 函数返回。这个句柄需要拥有EVENT_MODIFY_STATE 访问权限。函数成功,返回非0值,否则返回0值,可以调用GetLastError得到错误的详细信息。
      这个函数用于手动重置事件对象。手动重置的对象在线程释放后必须手动置为无信号状态。自动重置的事件对象在一个等待它成功的线程释放后会自动变为无信号状态。 重置一个无信号的事件对象没有任何效果。

(4)WaitForSingleObject

函数原型:
DWORD WaitForSingleObject( 

      HANDLE hHandle, 

      DWORD dwMilliseconds

);
参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果事件是有信号状态返回WAIT_OBJECT_0,如果事件超过dwMilliseconds值但事件还是无信号状态,则返回WAIT_TIMEOUT。之前线程会一直阻塞程序在该语句处。

 

参考原文:http://blog.pfan.cn/embed/19089.html

你可能感兴趣的:(object,Security,null,attributes,winapi)