delphi中的執行緒類<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
猛禽[mental studio]
之三說完建構函式,再來看析構函式:
destructor tthread.destroy;
begin
if (fthreadid <> 0) and not ffinished then
begin
terminate;
if fcreatesuspended then
resume;
waitfor;
end;
if fhandle <> 0 then closehandle(fhandle);
inherited destroy;
ffatalexception.free;
removethread;
end;
procedure tthread.terminate;
begin
fterminated := true;
end;
所以執行緒仍然必須繼續執行到正常結束後才行,而不是立即終止執行緒,這一點要注意。
在這裡說一點題外話:很多人都問過我,如何才能「立即」終止執行緒(當然是指用tthread建立的執行緒)。結果當然是不行!終止執行緒的唯一辦法就是讓execute方法執行完畢,所以一般來說,要讓你的執行緒能夠盡快終止,必須在execute方法中在較短的時間內不斷地檢查terminated標誌,以便能及時地退出。這是設計執行緒**的乙個很重要的原則!
當然如果你一定要能「立即」退出執行緒,那麼tthread類不是乙個好的選擇,因為如果用api強制終止執行緒的話,最終會導致tthread執行緒物件不能被正確釋放,在物件析構時出現access violation。這種情況你只能用api或rtl函式來建立執行緒。
如果執行緒處於啟動掛起狀態,則將執行緒轉入執行狀態,然後呼叫waitfor進行等待,其功能就是等待到執行緒結束後才繼續向下執行。關於waitfor的實現,將放到後面說明。
執行緒結束後,關閉執行緒handle(正常執行緒建立的情況下handle都是存在的),釋放作業系統建立的執行緒物件。
然後呼叫tobject.destroy釋放本物件,並釋放已經捕獲的異常物件,最後呼叫removethread減小程序的執行緒數。
其它關於suspend/resume及執行緒優先順序設定等方面,不是本文的重點,不再贅述。下面要討論的是本文的另兩個重點:synchronize和waitfor。
但是在介紹這兩個函式之前,需要先介紹另外兩個執行緒同步技術:事件和臨界區。
事件(event)與delphi中的事件有所不同。從本質上說,event其實相當於乙個全域性的布林變數。它有兩個賦值操作:set和reset,相當於把它設定為true或false。而檢查它的值是通過waitfor操作進行。對應在windows平台上,是三個api函式:setevent、resetevent、waitforsingleobject(實現waitfor功能的api還有幾個,這是最簡單的乙個)。
這三個都是原語,所以event可以實現一般布林變數不能實現的在多執行緒中的應用。set和reset的功能前面已經說過了,現在來說一下waitfor的功能:
waitfor的功能是檢查event的狀態是否是set狀態(相當於true),如果是則立即返回,如果不是,則等待它變為set狀態,在等待期間,呼叫waitfor的執行緒處於掛起狀態。另外waitfor有乙個引數用於超時設定,如果此引數為0,則不等待,立即返回event的狀態,如果是infinite則無限等待,直到set狀態發生,若是乙個有限的數值,則等待相應的毫秒數後返回event的狀態。
當然用乙個受保護(見下面的臨界區介紹)的布林變數也能實現類似的功能,只要用乙個迴圈檢查此布林值的**來代替waitfor即可。從功能上說完全沒有問題,但實際使用中就會發現,這樣的等待會占用大量的cpu資源,降低系統效能,影響到別的執行緒的執行速度,所以是不經濟的,有的時候甚至可能會有問題。所以不建議這樣用。
(待續)
Delphi中的執行緒類(2)
首先就是建構函式 constructor tthread.create createsuspended boolean begin inherited create addthread fsuspended createsuspended fcreatesuspended createsuspend...
Delphi多執行緒學習(3) 執行緒同步的原因
在使用多執行緒的時候,如果多執行緒對某個特定的公共資料或資源進行訪問,需要對多執行緒進行協調操作,叫做執行緒同步。例如 三個執行緒分別迴圈地向listbox中寫入資料。沒有進行同步時,寫入的順序是不確定的。三個執行緒根據分配到的cpu時間的順序向listbox中寫入資料。這裡的公共資源是listbo...
Delphi中多執行緒中Synchronize的運用
delphi中多執行緒用synchronize實現vcl資料同步顯示,delphi中多執行緒用synchronize實現vcl資料同步顯示 概述 vcl實現同步的另一種方法就是呼叫執行緒類的synchronize的過程,此過程需要乙個無引數的procedure,故在此procedure中無法傳遞引數...