Event事件控制
事件對象就像一個開關(guān):它只有兩種狀態(tài)---開和關(guān)。當(dāng)一個事件處于”開”狀態(tài),我們稱其為”有信號”否則稱為”無信號”。可以在一個線程的執(zhí)行函數(shù)中創(chuàng)建一個事件對象,然后觀察它的狀態(tài),如果是”無信號”就讓該線程睡眠,這樣該線程占用的CPU時間就比較少。
產(chǎn)生事件對象的函數(shù)如下: ?
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name ); 該函數(shù)創(chuàng)建一個Event同步對象,如果CreateEvent調(diào)用成功的話,會返回新生成的對象的句柄,否則返回NULL。
參數(shù)說明:
? ? lpEventAttributes ? ? 一般為NULL
? ? bManualReset ? ? ? ? ?創(chuàng)建的Event是自動復(fù)位還是人工復(fù)位.如果true,人工復(fù)位,一旦該Event被設(shè)置為有信號,則它一直會等到ResetEvent()API被調(diào)用時才會恢復(fù)為無信號.如果為false,Event被設(shè)置為有信號,則當(dāng)有一個wait到它的Thread時,該Event就會自動復(fù)位,變成無信號.如果想 在每次調(diào)用WaitForSingleObject后讓W(xué)INDOWS為您自動地把事件地狀態(tài)恢復(fù)為”無信號”狀態(tài),必須把該參數(shù)設(shè)為FALSE,否則,您必須每次調(diào)用ResetEvent函數(shù)來清除事件的信號。
? ? bInitialState ? ? ? ? 初始狀態(tài),true,有信號,false無信號 ??
? ? lpName ? ? ? ? ? ? ? ?事件對象的名稱。您在OpenEvent函數(shù)中可能使用。
注釋:
? ? 一個Event被創(chuàng)建以后,可以用OpenEvent()API來獲得它的Handle,用CloseHandle() ? ?來關(guān)閉它,用SetEvent()或PulseEvent()來設(shè)置它使其有信號,用ResetEvent()來使其無信號,用WaitForSingleObject()或WaitForMultipleObjects()來等待其變?yōu)橛行盘? PulseEvent()是一個比較有意思的使用方法,正如這個API的名字,它使一個Event 對象的狀態(tài)發(fā)生一次脈沖變化,從無信號變成有信號再變成無信號,而整個操作是原子的.對自動復(fù)位的Event對象,它僅釋放第一個等到該事件的thread(如果有),而對于人工復(fù)位的Event對象,它釋放所有等待的thread.
這里有兩個API函數(shù)用來修改事件對象的信號狀態(tài):SetEvent和ResetEvent。前者把事件對象設(shè)為”有信號”狀態(tài),而后者正好相反。?
在事件對象生成后,必須調(diào)用WaitForSingleObject來讓線程進入等待狀態(tài),該函數(shù)的語法如下: ?
WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD ?
hObject -->指向同步對象的指針。事件對象其實是同步對象的一種。?
dwTimeout --> 等待同步對象變成”有信號”前等待的時間,以毫秒計。當(dāng)?shù)却臅r間超過該值后無信號同步對象仍處于”無信號”狀態(tài),線程不再等待, WaitForSingleObject函數(shù)會返回。如果想要線程一直等待,請把該參數(shù)設(shè)為INFINITE(該值等于0xffffffff)。
產(chǎn)生事件對象的函數(shù)如下: ?
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name ); 該函數(shù)創(chuàng)建一個Event同步對象,如果CreateEvent調(diào)用成功的話,會返回新生成的對象的句柄,否則返回NULL。
參數(shù)說明:
? ? lpEventAttributes ? ? 一般為NULL
? ? bManualReset ? ? ? ? ?創(chuàng)建的Event是自動復(fù)位還是人工復(fù)位.如果true,人工復(fù)位,一旦該Event被設(shè)置為有信號,則它一直會等到ResetEvent()API被調(diào)用時才會恢復(fù)為無信號.如果為false,Event被設(shè)置為有信號,則當(dāng)有一個wait到它的Thread時,該Event就會自動復(fù)位,變成無信號.如果想 在每次調(diào)用WaitForSingleObject后讓W(xué)INDOWS為您自動地把事件地狀態(tài)恢復(fù)為”無信號”狀態(tài),必須把該參數(shù)設(shè)為FALSE,否則,您必須每次調(diào)用ResetEvent函數(shù)來清除事件的信號。
? ? bInitialState ? ? ? ? 初始狀態(tài),true,有信號,false無信號 ??
? ? lpName ? ? ? ? ? ? ? ?事件對象的名稱。您在OpenEvent函數(shù)中可能使用。
注釋:
? ? 一個Event被創(chuàng)建以后,可以用OpenEvent()API來獲得它的Handle,用CloseHandle() ? ?來關(guān)閉它,用SetEvent()或PulseEvent()來設(shè)置它使其有信號,用ResetEvent()來使其無信號,用WaitForSingleObject()或WaitForMultipleObjects()來等待其變?yōu)橛行盘? PulseEvent()是一個比較有意思的使用方法,正如這個API的名字,它使一個Event 對象的狀態(tài)發(fā)生一次脈沖變化,從無信號變成有信號再變成無信號,而整個操作是原子的.對自動復(fù)位的Event對象,它僅釋放第一個等到該事件的thread(如果有),而對于人工復(fù)位的Event對象,它釋放所有等待的thread.
這里有兩個API函數(shù)用來修改事件對象的信號狀態(tài):SetEvent和ResetEvent。前者把事件對象設(shè)為”有信號”狀態(tài),而后者正好相反。?
在事件對象生成后,必須調(diào)用WaitForSingleObject來讓線程進入等待狀態(tài),該函數(shù)的語法如下: ?
WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD ?
hObject -->指向同步對象的指針。事件對象其實是同步對象的一種。?
dwTimeout --> 等待同步對象變成”有信號”前等待的時間,以毫秒計。當(dāng)?shù)却臅r間超過該值后無信號同步對象仍處于”無信號”狀態(tài),線程不再等待, WaitForSingleObject函數(shù)會返回。如果想要線程一直等待,請把該參數(shù)設(shè)為INFINITE(該值等于0xffffffff)。
總結(jié)
- 上一篇: 详解Windows内存分页机制
- 下一篇: gh0st支持win7和win8