1. 程式人生 > >簡單說說Delphi中線程的釋放

簡單說說Delphi中線程的釋放

keyword con 停止 標誌位 在線 creat 自動釋放 num sdn

線程的釋放方式有兩種:一種是線程在運行完成後自動釋放,一種是手動釋放。

無論是那種釋放,都應該在線程停止後進行釋放。

然而線程的停止也有兩種情況:一種是不需要設置標誌位,直接完成;一種是由於execute方法中做了循環,需要設置標誌位才能停止。

如果線程已經停止並且自動釋放,再去手動停止,就會報錯。

下面看代碼:

1、自動停止後自動釋放的線程:

[delphi] view plain copy
  1. constructor TTestThread.Create;
  2. begin
  3. inherited Create( True );
  4. FreeOnTerminate := True;
  5. end;
  6. procedure TTestThread.Execute;
  7. begin
  8. ....//功能代碼
  9. //此方法完成後線程就已經停止了
  10. end;

這種情況線程會自動釋放,因此不要手動釋放,否則會報錯

2、手動停止後自動釋放的線程:

[delphi] view plain copy
  1. constructor TTestThread.Create;
  2. begin
  3. inherited Create( True );
  4. FreeOnTerminate := True;
  5. end;
  6. procedure TTestThread.Execute;
  7. begin
  8. while not Terminated do //not Terminated do
  9. begin
  10. ....//功能代碼
  11. end;
  12. end;
  13. procedure Test
  14. begin
  15. t1 := TTestThread.Create( Self );
  16. t1.Terminate;
  17. end;

3、手動釋放的線程:

[delphi] view plain copy
  1. constructor TTestThread.Create;
  2. begin
  3. inherited Create( True );
  4. end;
  5. procedure TTestThread.Execute;
  6. begin
  7. while not Terminated do //not Terminated do
  8. begin
  9. ....//功能代碼
  10. end;
  11. end;
  12. procedure Test
  13. begin
  14. t1 := TTestThread.Create( Self );
  15. t1.Terminate;
  16. t1.WaitFor;
  17. t1.Free;
  18. end;

那麽,何時使用自動釋放的線程,何時使用手動釋放的線程呢

我的建議是:

如果這個線程運行時間很短或者能保證在系統退出前完成運行,則可以選擇自動釋放,因為它可以很快自動釋放掉

如果這個線程運行貫穿系統運行整個期間,則要選擇手動釋放了

http://blog.csdn.net/youthon/article/details/6721692

簡單說說Delphi中線程的釋放