Delphi執行緒的終止

2022-07-01 16:57:07 字數 2395 閱讀 8388

**自:

當執行緒物件的execute()執行完畢,我們就認為此執行緒終止了。這時候,它會呼叫delphi的乙個標準例程endthread(),這個例程再呼叫api函式exitthread()。由exitthread()來清除執行緒所占用的棧。

當結束使用tthread物件時,應該確保已經把這個delphi物件從記憶體中清除了。這才能確保所有記憶體占有都釋放掉。儘管在程序終止時會自動清除所有的執行緒物件,但是及時清除已經不再使用的物件,可以使記憶體的使用效率提高。利用將freeonterminate的屬性設定為true的方法來及時清除執行緒物件時最方便的方法,這只需要在execute()退出之前設定就行了。設定的方法如下12

3456

78procedurettestthread.execute;

var

i:integer;

begin

freeonterminate:=true;

fori:=1to2000000do

inc(answer, round(abs(sin(sqrt(i)))));

end;

這樣,當乙個執行緒終止的時候,就會觸發onterminate事件,就會有機會在事件處理過程中清除執行緒物件了。12

3456

78910

1112

procedurettestthread.execute;

var

i:integer;

begin

freeonterminate:=true;

fori:=1to2000000do

begin

ifterminatedthen

break;

inc(answer, round(abs(sin(sqrt(i)))));

end;

end;

注意,在某些緊急情況下,你可以使用win32 api函式 terminatethread()來終止乙個執行緒。但是,除非沒有別的辦法了,否則不要使用它。例如,當執行緒**陷入死迴圈中。terminatethread()的宣告如下

1functionterminatethread(hthread: thandle; dwexitcode: dword);

tthread的handle屬性可以作為第乙個引數,因此,terminatethread()常這樣呼叫

1terminatethread(myhosedthread.handle,0);

如果選擇這個函式,應該考慮到它的負面影響。首先,此函式在windows nt與在windows95/98下並不相同。在windows95/98下,這個函式能夠自動清除執行緒所占用的棧;而在windows nt下,在程序被終止前棧仍被保留。其次,無論執行緒**中是否有try...finally塊,這個函式都會使執行緒立即終止執行。這意味著,被執行緒開啟的檔案沒有被關閉、由執行緒申請的記憶體也沒有被釋放等情況。而且,這個函式在終止執行緒的時候也不通知dll,當dll關閉的時候,這也容易出現enti問題

執行緒的終止

1.程序中的任意執行緒呼叫了exit exit 或者 exit,那麼整個程序就會終止。2.如果預設的動作是終止程序,那麼傳送到執行緒的訊號也會終止整個程序。在不終止程序的情況下停止單個執行緒 1.執行緒可以從啟動例程中返回 return 返回值是執行緒的退出碼。2.執行緒可以被同一程序中的其他執行緒...

執行緒 終止執行緒執行

stop 方法 缺點 強制終止會丟資料 不建議使用 public class myfile catch interruptedexception e 5秒後終止執行緒 t.stop 已過時,強制終止會丟資料 class myrunnable implements runnable catch int...

多執行緒 執行緒終止

stop 中止執行緒,並且清除監視器鎖的資訊,可能導致執行緒安全問題。destroy 從未實現過這個方法 public class demo thread.print public class stopthread extends thread catch interruptedexception ...