2010年12月9日

[C++學習筆記]event物件

Win32之中最具有彈性的同步機制就屬events物件了。Event物件是一種核心物件,它唯一目的就是成為激發狀態或為激發狀態。

SetEvent() : 把 event物件設為激發狀態。
ResetEvent() : 把event 物件設為非激發狀態
PulseEvent() : 如果是一個
Manual Reset Event:把event物件設為激發狀態,喚醒『所有』等待中的執行緒, 然後event恢復為非激發。
如果一個Auto Reset Event:把event物件設為激發狀態,喚醒『一個』等待中的執行緒,然後event恢復為非激發狀態。

Event物件被運用在多種型態的高級 I/0動作, Event物件也可以用來設計你自己的同步物件。
你可以呼叫CreateEvent()來產生一個event物件。

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES IpEventAttributes,
BOOL bManuaIReset,
BOOL bInitialState,
LPCTSTR IpName

);

參數

IpEventAttributes:安全防護性,NULL表示使用預設屬性,此屬性Windows95會被忽略。

bManualRest:如為FALSE,表示這個event將在變成激發狀態態的event重置為非激發狀態。
(因而喚醒一個執行緒)之後,自動重置reset)為非激發狀態。如果是TRUE,表示不會自動重置,必防護屬性。NU比表示使用預設屬性。此屬性須靠程式動作(呼叫ResetEvent())才能將激發狀

bIntialState:如為TRUE,表示這個event一開始處於激發狀態。如為FALSE,表示這個event一開始處於非激發狀態。

lpName:Event物件的名稱。任何執行緒或行程都可以根據這個文字名稱,使用此一event物件。


回傳值

如果呼叫成功,會傳回一個 eventhandle , GetLastError()會傳回 0。如果lpName所指定的 event物件已經存在,CreateEvent()傳回的是該eventhandle,而不會產生新的一個。這時候 GetLastError()會傳回ERROR_ALREADY_EXISTS。如果 CreateEvent()失敗,傳回的是 NULL,GetLastError()可以獲得更進一步的失敗資訊。