CreateEvent和SetEvent及WaitForSingleObject的用法

CreateEvent:

1、函数功能:

创建一个命名或匿名的事件对象

2、函数原型:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

 // pointer to security attributes

  BOOL bManualReset   // flag for manual-reset event

  BOOL bInitialState,   // flag for initial state

  LPCTSTR lpName        // pointer to event-object name

);

3、参数解析:

参数1指向一个SECURITY_ATTRIBUTES 结构,如果为空,函数返回的句柄不能被继承。

参数2用于指示创建的事件对象是人工重置还是自动重置的。如果这个参数为TRUE,则为人工重置事件,必须调用ResetEvent置事件为无信号状态;如果这个参数为FALSE,则为自动重置事件,当等待的线程被释放后,系统自动重置事件为无信号状态。

参数3标识事件的初始状态,如果为TRUE,则事件初始状态为有信号状态,否则,事件初始状态为无信号状态。

参数4标识创建的事件对象名称,当这个参数为NULL时,创建的事件对象为匿名事件。

4、函数返回值:

如果函数返回成功,返回值为事件对象的句柄。

如果函数返回失败,返回值为NULL,可以通过GetLastError()得到错误信息。

5、补充:

如果创建的是一个命名的事件对象,当第2次重复调用的时候,函数返回第1次创建成功的句柄值,这时通过GetLastError()返回的值为ERROR_ALREADY_EXISTS,利用这个特性,可以实现应用程序的单例。

WaitForSingleObject:

VC声明DWORD WaitForSingleObject(

  HANDLE hHandle,

  DWORD dwMilliseconds

  );

  VB声明Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

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

  hHandle可以是下列对象的句柄:

  Change notification

  Console input

  Event

  Job

  Memory resource notification

  Mutex

  Process

  Semaphore

  Thread

  Waitable timer

  WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

  返回值:

  WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。

  WAIT_OBJECT_0 0x00000000 :核心对象已被激活

  WAIT_TIMEOUT 0x00000102:等待超时

  WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码

  在这里举个例子:

  先创建一个全局Event对象g_event:

  CEvent g_event;

  在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。

综合:

首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面.

CreateEvent

函功能描述:创建或打开一个命名的或无名的事件对象.

EVENT有两种状态:发信号,不发信号。

SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。

WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,

也可以是其它内核对象。

当你创建一个线程时,其实那个线程是一个循环,不像上面那样只运行一次的。这样就带来了一个问题,

在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用

事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,

它的实现原理是这样,在那个死循环里不断地使用WaitForSingleObject函数来检查事件是否满足,如果

满足就退出线程,不满足就继续运行。当在线程里运行阻塞的函数时,就需要在退出线程时,先要把阻塞

状态变成非阻塞状态,比如使用一个线程去接收网络数据,同时使用阻塞的SOCKET时,那么要先关闭

SOCKET,再发送事件信号,才可以退出线程的。

当然我感觉重要应用方面还是用来锁定,实现所谓的pv功能。

下面介绍函数功能,参数等

1.CreateEvent

函数功能描述:创建或打开一个命名的或无名的事件对象

函数原型:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,   // 安全属性

BOOL bManualReset,   // 复位方式

BOOL bInitialState,   // 初始状态

LPCTSTR lpName   // 对象名称

);

参数:

lpEventAttributes:

[输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。

Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果pEventAttributes是NULL,事件将获得一个默认的安全符。

bManualReset:

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

bInitialState:

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

lpName:

[输入]指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。

如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。

如果lpName为NULL,将创建一个无名的事件对象。

如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。

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

PulseEvent()是一个比较有意思的使用方法,正如这个API的名字,它使一个Event    对象的状态发生一次脉冲变化,从无信号变成有信号再变成无信号,而整个操作是原子的.
  对自动复位的Event对象,它仅释放第一个等到该事件的thread(如果有),而对于   人工复位的Event对象,它释放所有等待的thread.

2.    WaitForSingleObject的用法

WaitForSingleObject的用法

DWORD WaitForSingleObject(

HANDLE hHandle,

DWORD dwMilliseconds

);

参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回

WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

hHandle可以是下列对象的句柄:

Change notification

Console input

Event

Job

Memory resource notification

Mutex

Process

Semaphore

Thread

Waitable timer

WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。

时间: 2024-10-03 23:15:28

CreateEvent和SetEvent及WaitForSingleObject的用法的相关文章

线程中CreateEvent和SetEvent及WaitForSingleObject的用法

线程中CreateEvent和SetEvent及WaitForSingleObject的用法 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号,不发信号. SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号. WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时

CreateEvent和SetEvent及WaitForSingleObject的使用方法

CreateEvent: 1.函数功能: 创建一个命名或匿名的事件对象 2.函数原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,  // pointer to security attributes   BOOL bManualReset,    // flag for manual-reset event   BOOL bInitialState,   // flag for initial state   LPC

CreateEvent、SetEvent、ResetEvent和WaitForSingleObject

事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号",否则称为"无信号".可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是"无信号"就让该线程睡眠,这样该线程占用的CPU时间就比较少. 产生事件对象的函数如下: (1)CreateEvent 函数原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttribu

WaitForSingleObject的用法

WaitForSingleObject的用法 1.WaitForSingleObject 的用法 DWORD WaitForSingleObject(                      HANDLE hHandle,                       DWORD dwMilliseconds                   ); 参数 hHandle 是一个事件的句柄,第二个参数 dwMilliseconds 是时间间隔.如果时间是有信号状态返回 WAIT_OBJECT_0

setevent/waitforsingleobject

线程中CreateEvent和SetEvent及WaitForSingleObject的用法          博客分类: delphi 多线程WindowsSocket网络应用thread 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象.EVENT有两种状态:发信号,不发信号. SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号

线程中的WaitForSingleObject和Event的用法

http://chinaxyw.iteye.com/blog/548622 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号,不发信号. SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号. WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJEC

WaitForSingleObject用法介绍

WaitForSingleObject的用法 DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); 参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔.如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT. hHandle可以是下列对象的句柄: Change notification Cons

[转]同步对象Event的用法

同步对象Event的用法  首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面.  CreateEvent函数功能描述:创建或打开一个命名的或无名的事件对象.  EVENT有两种状态:发信号,不发信号.   SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号.   WaitForSingleObject()等待(阻塞),直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以

CreateEvent的使用方法

?CreateEvent的使用方法收藏 新一篇:?PreCreateWindow的作用和用法?|?旧一篇:?VC中_T()的作用 事件对象就像一个开关:它仅仅有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号"否则称为"无信号".能够在一个线程的运行函数中创建一个事件对象,然后观察它的状态,假设是"无信号"就让该线程睡眠,这样该线程占用的CPU时间就比較少. 产生事件对象的函数例如以下:?? HANDLE?