多线程Event之详解

来源:互联网 发布:数据库计算机的主机名 编辑:程序博客网 时间:2024/05/19 15:39


Ø  要产生一个event对象,需要调用CreateEvent

HANDLE CreateEvent

(

                 LPSECURITY_ATTRIBUTESlpEventAttributes,

                 BOOL bManualReset,

                 BOOL bInitialState,

                 LPCTSTR lpName

);

 

         参数:

         lpEventAttributes    安全属性,NULL表示使用默认属性,该属性在Window 95中会被忽

略。

         bManualReset          如为FALSE,表示这个event将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。若为TRUE则表示不会自动重置,必须靠程序操作(调用ResetEvent())才能将激发状态的event

重置为非激发状态。

         bInitialState              如为TRUE,表示这个event一开始处于激发状态。如为FALSE,则表示这个event一开始处于非激发状态。

         lpName                       Event对象的名称。任何线程或进程都可以根据这个文字名称,使用这一event对象。

 

         返回值:

                   如果调用成功,会传回一个event handle,GetLastError()会传回0。如果lpName所指定的event对象已经存在,CreateEvent()传回的是该event handle,而不会产生一个新的。这时候GetLastError会传回ERROR_ALREADY_EXISTS。如果CreateEvent()失败,传回的是NULL,GetLastError()可以获得更进一步的失败信息。

Ø  函数说明

SetEvent()         把event对象设为激发状态

ResetEvent()    把event对象设为非激发状态

PulseEvent()     如果是一个Manual Reset Event:把event对象设为激发状态,唤醒“所

有”等待中的线程,然后event恢复为非激发状态。如果是一个Auto Reset

Event:把evnet对象设为激发状态,唤醒“一个”等待中的线程,然后event

恢复为非激发状态。

Ø  名词说明

激发态:       可以再次被锁定或可以被WaitXXXXObjectXX类函数等待成功(可以这样认为,现在对象的状态是:其他线程可以处理这个对象了)

非激发态:  这个对象已经被其中一个线程所拥有,则此时这个对象所呈现的状态是其他线程不能再得到这个对象。当用WaitXXX函数操作时,不会成功。

 

Ø  使用方法1

  HANDLE hEvent = ::CreateEvent(

                            NULL,       //默认安全属性

                            TRUE,       //手动重置

                            FALSE,       //初始处于非激发态

                            NULL         //名子

                            );

  SetEvent(hEvent);             //设置为激发态

 

 

 DWORD WINAPI ThreadFun1(LPVOID p)

{

         WaitForSingleObject(hEvent,INFINITE);

         ResetEvent(hEvent);                                                                         //设置为非激发态

         /*

         操作……

         */

         SetEvent(hEvent);                                                                              //设置为激发态

        

         return (DWORD) 0;

}

 

Ø  使用方法2

 HANDLE hEvent = ::CreateEvent(

                            NULL,       //默认安全属性

                            FALSE,       //自动重置

                            FALSE,       //一开始处于非激发态

                            NULL         //名子

                            );

                  SetEvent(hEvent);                      //设置为激发态

 

 DWORD WINAPI ThreadFun1(LPVOID p)

{

         WaitForSingleObject(hEvent,INFINITE);

                            /*

         操作……

         */

         SetEvent(hEvent);                                                                              //设置为激发态

        

         return (DWORD) 0;

}

 

原创粉丝点击