天天看點

CreateEvent的用法

事件對象就像一個開關:它隻有兩種狀态---開和關。當一個事件處于”開”狀态,我們稱其為”有信号”否則稱為”無信号”。可以在一個線程的執行函數中建立一個事件對象,然後觀察它的狀态,如果是”無信号”就讓該線程睡眠,這樣該線程占用的CPU時間就比較少。

産生事件對象的函數如下:  

HANDLE     CreateEvent(

        LPSECURITY_ATTRIBUTES     lpEventAttributes,     //     SD   

        BOOL     bManualReset,                                                 //     reset     type   

        BOOL     bInitialState,                                                      //     initial     state   

        LPCTSTR     lpName                                                       //     object     name   

    );   

    該函數建立一個Event同步對象,如果CreateEvent調用成功的話,會傳回新生成的對象的句柄,否則傳回NULL。

參數說明:

    lpEventAttributes     一般為NULL   

    bManualReset               建立的Event是自動複位還是人工複位.如果true,人工複位,   一旦該Event被設定為有信号,則它一直會等到ResetEvent()API被調用時才會恢複 為無信号.     如果為false,Event被設定為有信号,則當有一個wait到它的Thread時,  該Event就會自動複位,變成無信号.   如果想在每次調用WaitForSingleObject 後讓WINDOWS為您自動地把事件地狀态恢複為”無信号”狀态,必須把該參數設為FALSE,否則,您必須每次調用ResetEvent函數來清除事件的信号。

    bInitialState             初始狀态,true,有信号,false無信号   

    lpName                  事件對象的名稱。您在OpenEvent函數中可能使用。

注釋:

    一個Event被建立以後,可以用OpenEvent()API來獲得它的Handle,用CloseHandle()    來關閉它,用SetEvent()或PulseEvent()來設定它使其有信号,用ResetEvent()       來使其無信号,用WaitForSingleObject()或WaitForMultipleObjects()來等待其變為有信号.   

    PulseEvent()是一個比較有意思的使用方法,正如這個API的名字,它使一個Event 對象的狀态發生一次脈沖變化,從無信号變成有信号再變成無信号,而整個操作是原子的.   

    對自動複位的Event對象,它僅釋放第一個等到該事件的thread(如果有),而對于人工複位的Event對象,它釋放所有等待的thread.  

這裡有兩個API函數用來修改事件對象的信号狀态:SetEvent和ResetEvent。前者把事件對象設為”有信号”狀态,而後者正好相反。 

在事件對象生成後,必須調用WaitForSingleObject來讓線程進入等待狀态,該函數的文法如下:  

WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD  

hObject -->指向同步對象的指針。事件對象其實是同步對象的一種。 

dwTimeout --> 等待同步對象變成”有信号”前等待的時間,以毫秒計。當等待的時間超過該值後無信号同步對象仍處于”無信号”狀态,線程不再等待,WaitForSingleObject函數會傳回。如果想要線程一直等待,請把該參數設為INFINITE(該值等于0xffffffff)。  

繼續閱讀