使用事件CreateEvent注意事項

2022-09-12 16:27:29 字數 2695 閱讀 4008

handlecreateevent(

lpsecurity_attributeslpeventattributes,// 安全屬性

boolbmanualreset,// 復位方式

boolbinitialstate,// 初始狀態

lpctstrlpname // 物件名稱

);[1]

乙個指向security_attributes結構的指標,確定返回的控制代碼是否可被子程序繼承。如果lpeventattributes是null,此控制代碼不能被繼承。

windows nt/2000:lpeventattributes的結構中的成員為新的事件指定了乙個安全符。如果lpeventattributes是null,事件將獲得乙個預設的安全符。

bmanualreset[輸入]

指定將事件物件建立成手動復原還是自動復原。如果是true,那麼必須用resetevent函式來手工將事件的狀態復原到無訊號狀態。如果設定為false,當乙個等待執行緒被釋放以後,系統將會自動將事件狀態復原為無訊號狀態。

binitialstate[輸入]

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

lpname[輸入]

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

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

如果lpname為null,將建立乙個無名的事件物件。

注意:1、如果在程序間同步,需要建立具體名稱的事件,即引數lpname不能為nil,事件物件的名稱一樣。

2、手動復原的情況下,先setevent發起訊號,後面一定要用resetevent復原到無訊號狀態,一一對應。

如果setevent後,所有的事件物件都有訊號了。當事件的物件被置為有訊號狀態時,任意數量的等待中線程,以及隨後開始等待的執行緒均會被釋放。

varfevent: cardinal;

fevent := createevent

(nil, true, false, 'syn_recansend');//建立時無訊號的事件

setevent(fevent);//發起訊號

或者fevent := createevent

(nil, true, true, 'syn_recansend');//建立時無訊號的事件

//手動復原

procedure tform1.btn5click(sender: tobject);

begin

if waitforsingleobject(fevent, infinite) = wait_object_0 then  //等於wait_object_0成功返回有訊號

begin

resetevent(fevent);//等到訊號後置成無訊號,以便其他執行緒等待

outputdebugstring('寫檔案等事情,需要同步的**');

setevent(fevent);//做完上面的事情後置成有訊號的狀態,以便其他執行緒等待到有訊號做事情

end;

end;

3、自動復原訊號的情況下,setevent只會釋放當前等待的乙個執行緒;

當乙個自動復原的事件物件的狀態被置為有訊號狀態時,該物件狀態將一直保持有訊號狀態,直至乙個等待執行緒被釋放;系統將自動將此函式置為無符號狀態。如果沒有等待執行緒正在等待,事件物件的狀態將保持有訊號狀態。

varfevent: cardinal;

fevent := createevent

(nil, false, false, 'syn_recansend');//建立時無訊號的事件

setevent(fevent);//發起訊號

或者fevent := createevent

(nil, false, true, 'syn_recansend');//建立時無訊號的事件

//自動復原

procedure tform1.btn5click(sender: tobject);

begin  

if waitforsingleobject(fevent, infinite) = wait_object_0 then  //等於wait_object_0成功返回訊號時,會釋自動釋放訊號 

begin

outputdebugstring('寫檔案等事情,需要同步的**');

setevent(fevent);//做完上面的事情後置成有訊號的狀態,以便其他執行緒等待到有訊號做事情   ;

end;

//這裡不要setevent(fevent);,上面的waitforsingleobject等待成功時才會自動resetevent,所以上面才會有setevent。

end;

4、最後釋放事件

if fevent <> 0 then

closehandle(fevent);

如何使用事件

事件有很多,比如說滑鼠的事件 mousermove,mouserdown等,鍵盤的事件 keyup,keydown,keypress。有事件,就會有對事件進行處理的方法,而事件和處理方法之間是怎麼聯絡起來的呢?委託就是他們中間的橋梁,事件發生時,委託會知道,然後將事件傳遞給處理方法,處理方法進行相應...

CreateEvent人工重置事件物件

include include 人工重置的事件物件有訊號狀態,所有的執行緒都可以執行resetevent 自動重置的事件物件有訊號狀態,所有的執行緒只有乙個變為可排程執行緒 dword winapi threadproc1 lpvoid lpparameter dword winapi thread...

主動驅動事件執行 createEvent

1.createevent eventtype 引數 eventtype 共5種型別 events 包括所有的事件.htmlevents 包括 abort blur change error focus load reset resize scroll select submit unload 事件...