多线程同步:事件

来源:互联网 发布:php没有ext文件夹 编辑:程序博客网 时间:2024/05/24 06:44

<1>win32中事件对象的使用

(1)win32中头文件

< Windows.h>

(2)创建事件对象

 

1)函数原型

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset,

BOOL bInitialState,

LPCTSTR lpName

);

 

2)参数说明

lpEventAttributes

安全性。如果是NULL,事件将获得一个默认的安全符。

 

 

 

bManualReset

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

 当人工重置事件对象得到通知时,等待该事件对象的所有线程均变为可调度线程。当一个自动重置的事件对象得到通知时,等待该事件对象的线程只有一个线程变为可调度线程,同时操作系统会将该事件对象设置为无信号状态。

bInitialState

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

lpName

指定事件的对象的名称

 

3)返回值

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

如果对于命名的对象,在函数调用前已经被创建,函数将返回存在的事件对象的句柄,而且在GetLastError函数中返回ERROR_ALREADY_EXISTS。因此:可以通过创建一个命名的事件对象,实现应用程序只有一个实例可以运行。

例:my_Event=CreateEvent(NULL,FALSE,FALSE,”mine”);

    if(my_Event)

{

   if(ERROR_ALREADY_EXISTS==GetLastError())

{

 return;

}

}

else

{

  //执行程序

}

如果函数失败,函数返回值为NULL,如果需要获得详细的错误信息,需要调用GetLastError。

(3)设置事件对象状态

SetEvent(),这个函数把指定的事件对象设置为有信号状态。

BOOLSetEvent(HANDLE hEvent);   hEvent表示句柄。

返回值:如果操作成功,则返回非零值,否则为0。可以调用GetLastError得到错误的详细信息。

(4)重置事件对象状态

ResetEvent(),这个函数把指定的事件对象设置为无信号状态。

BOOL ResetEvent(HANDLE hEvent);  hEvent表示句柄。

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

<2>MFC中事件对象的使用

(1)MFC中头文件

"afxmt.h"

(2)创建事件对象

1)构造函数原型

CEvent(BOOLbInitiallyOwn=FALSE,

          BOOL bManualReset=FALSE,

          LPCTSTR lpszName=NULL,

          LPSECURITY_ATTRIBUTESlpsaAttribute=NULL);

2)参数说明

与 CreateEvent相同,注意顺序。

(3)设置事件对象状态

BOOLCEvent::SetEvent();

将 CEvent 类对象的状态设置为有信号状态。如果事件是人工事件,则 CEvent 类对象保持为有信号状态,直到调用成员函数ResetEvent()将 其重新设为无信号状态时为止。如果CEvent 类对象为自动事件,请求到事件对象后CEvent 类对象由系统自动重置为无信号状态。
如果该函数执行成功,则返回非零值,否则返回零。

(4)重置事件对象状态

BOOLCEvent::ResetEvent();

该函数将事件的状态设置为无信号状态,并保持该状态直至SetEvent()被调用时为止。由于自动事件是由系统自动重置,故自动事件不需要调用该函数。

如果该函数执行成功,返回非零值,否则返回零。

我们一般通过调用WaitForSingleObject函数来监视事件状态。

 

0 0
原创粉丝点击