簡單說說Delphi中線程的釋放


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

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

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

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

下面看代碼:

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

 

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

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

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

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

3、手動釋放的線程:

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

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

我的建議是:

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

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM