1. 程式人生 > >事件,事件物件,CreateEvent()

事件,事件物件,CreateEvent()

事件:

     事件是可以被控制元件識別的操作,如按下確定按鈕,選擇某個單選按鈕或者複選框。每一種控制元件有自己可以識別的事件,如窗體的載入、單擊、雙擊等事件,編輯框(文字框)的文字改變事件,等等。

事件物件:

事件物件和 互斥物件,一樣都屬於 核心物件,它包含:(1)一個使用計數,(2)一個用於標識該事件是一個自動重置還是一個人工重置的布林值,(3)另一個用於指定該事件處於已通知狀態還是未通知狀態的布林值。

由上面所述,可見事件物件可分為兩種,一種是人工重置的,另一種是自動重置的。當人工重置的事件得到通知時,等待該事件的所有執行緒均變為可排程執行緒。而當一個自動事件得到通知時,等待該事件的所有執行緒中只有一個執行緒變為可排程執行緒。

CreateEvent:

CreateEvent是一個WindowsAPI函式。它用來建立或開啟一個命名的或無名的事件對像。如果想為物件指定一個訪問掩碼,應當使用CreateEventEx函式。

HANDLECreateEvent(

LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全屬性,一個指向SECURITY_ATTRIBUTES結構的指標,確定返回的控制代碼是否可 被子程序繼承。如果lpEventAttributes是NULL,此控制代碼不能被繼承。

BOOLbManualReset,// 復位方式,指定將事件物件建立成手動復原還是自動復原。如果是TRUE,那麼必須用ResetEvent函式來手

工將事件的狀態復原到無訊號狀態。如果設定為FALSE,當一個等待執行緒被釋放以後,系統將會自動將事 件狀態復原為無訊號狀態。

BOOLbInitialState,// 初始狀態。指定事件物件的初始狀態。如果為TRUE,初始狀態為有訊號狀態;否則為無訊號狀態。

LPCTSTRlpName // 物件名稱,指定事件的物件的名稱,是一個以0結束的字串指標。名稱的字元格式限定在MAX_PATH之內。名 字是對大小寫敏感的。

);

如果函式呼叫成功,函式返回事件物件的控制代碼。如果對於命名的物件,在函式呼叫前已經被建立,函式將返回存在的事件物件的控制代碼,而且在GetLastError函式中返回ERROR_ALREADY_EXISTS。

如果函式失敗,函式返回值為NULL,如果需要獲得詳細的錯誤資訊,需要呼叫GetLastError。

指定事件的物件的名稱,是一個以0結束的字串指標。名稱的字元格式限定在MAX_PATH之內。名字是對大小寫敏感的。

如果lpName指定的名字,與一個存在的命名的事件物件的名稱相同,函式將請求EVENT_ALL_ACCESS來訪問存在的物件。這時候,由於bManualReset和bInitialState引數已經在建立事件的程序中設定,這兩個引數將被忽略。如果lpEventAttributes是引數不是NULL,它將確定此控制代碼是否可以被繼承,但是其安全描述符成員將被忽略。

如果lpName為NULL,將建立一個無名的事件物件。

如果lpName的和一個存在的訊號、互斥、等待計時器、作業或者是檔案對映物件名稱相同,函式將會失敗,在GetLastError函式中將返回ERROR_INVALID_HANDLE。造成這種現象的原因是這些物件共享同一個名稱空間