Delphi中的執行緒類 之(3)

2021-08-21 22:45:52 字數 1959 閱讀 9426

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中無法傳遞引數...