HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // reset type
BOOL bInitialState, // initial state
LPCTSTR lpName // object name
);
該函數建立一個Event同步對象,并傳回該對象的Handle
lpEventAttributes 一般為NULL
bManualReset 建立的Event是自動複位還是人工複位 ,如果true,人工複位,
一旦該Event被設定為有信号,則它一直會等到ResetEvent()API被調用時才會恢複
為無信号. 如果為false,Event被設定為有信号,則當有一個wait到它的Thread時,
該Event就會自動複位,變成無信号.
bInitialState 初始狀态,true,有信号,false無信号
lpName Event對象名
一個Event被建立以後,可以用OpenEvent()API來獲得它的Handle,用CloseHandle()
來關閉它,用SetEvent()或PulseEvent()來設定它使其有信号,用ResetEvent()
來使其無信号,用WaitForSingleObject()或WaitForMultipleObjects()來等待
其變為有信号.
PulseEvent()是一個比較有意思的使用方法,正如這個API的名字,它使一個Event
對象的狀态發生一次脈沖變化,從無信号變成有信号再變成無信号,而整個操作是原子的.
對自動複位的Event對象,它僅釋放第一個等到該事件的thread(如果有),而對于
人工複位的Event對象,它釋放所有等待的thread.
VC的初學者再學習線程概念的時候往往碰到CreateEvent()函數的使用,對于其中的參數不甚了解,對此做如下說明:
函數原型:
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
);
其中有四個參數,分别注解
LPSECURITY_ATTRIBUTES pEventAttributes 安區參數
一般使用者不用考慮它
BOOL bManualReset 表示SetEvent
置位,WaitForSingleObject使用以此後 信号量的有無,為TRUE 的時候,表示有信号,為FALSE為無信号,也可以了解為SetEvent
的作用是置一次信号,與PulseEvent函數作用相同了。
BOOL bInitialState, 表示初始時的信号量有無,為TRUE
的時,表示有信号,反之無信号
LPCTSTR lpName 信号量的别名
其中主要以BOOL bManualReset , BOOL
bInitialState, 的使用最為重要,采用那種配對方式取決于程式的工作方式了。