線程的釋放方式有兩種:一種是線程在運行完成后自動釋放,一種是手動釋放。
無論是那種釋放,都應該在線程停止后進行釋放。
然而線程的停止也有兩種情況:一種是不需要設置標志位,直接完成;一種是由於execute方法中做了循環,需要設置標志位才能停止。
如果線程已經停止並且自動釋放,再去手動停止,就會報錯。
下面看代碼:
1、自動停止后自動釋放的線程:
- constructor TTestThread.Create;
- begin
- inherited Create( True );
- FreeOnTerminate := True;
- end;
- procedure TTestThread.Execute;
- begin
- ....//功能代碼
- //此方法完成后線程就已經停止了
- end;
這種情況線程會自動釋放,因此不要手動釋放,否則會報錯
2、手動停止后自動釋放的線程:
- constructor TTestThread.Create;
- begin
- inherited Create( True );
- FreeOnTerminate := True;
- end;
- procedure TTestThread.Execute;
- begin
- while not Terminated do //not Terminated do
- begin
- ....//功能代碼
- end;
- end;
- procedure Test
- begin
- t1 := TTestThread.Create( Self );
- t1.Terminate;
- end;
3、手動釋放的線程:
- constructor TTestThread.Create;
- begin
- inherited Create( True );
- end;
- procedure TTestThread.Execute;
- begin
- while not Terminated do //not Terminated do
- begin
- ....//功能代碼
- end;
- end;
- procedure Test
- begin
- t1 := TTestThread.Create( Self );
- t1.Terminate;
- t1.WaitFor;
- t1.Free;
- end;
那么,何時使用自動釋放的線程,何時使用手動釋放的線程呢
我的建議是:
如果這個線程運行時間很短或者能保證在系統退出前完成運行,則可以選擇自動釋放,因為它可以很快自動釋放掉
如果這個線程運行貫穿系統運行整個期間,則要選擇手動釋放了
http://blog.csdn.net/youthon/article/details/6721692