Delphi中线程的释放


本文整理自网络,侵删。

 线程的释放方式有两种:一种是线程在运行完成后自动释放,一种是手动释放。无论是那种释放,都应该在线程停止后进行释放。然而线程的停止也有两种情况:一种是不需要设置标志位,直接完成;一种是由于execute方法中做了循环,需要设置标志位才能停止。

如果线程已经停止并且自动释放,再去手动停止,就会报错。

下面看代码:


1、自动停止后自动释放的线程:


constructor TTestThread.Create;  
begin  
  inherited Create( True );  
  FreeOnTerminate := True;  
end;  
  
procedure TTestThread.Execute;  
begin  
    ....//功能代码   
  
    //此方法完成后线程就已经停止了   
  
end;  

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;  

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;  

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;那么,何时使用自动释放的线程,何时使用手动释放的线程呢 
我的建议是:

如果这个线程运行时间很短或者能保证在系统退出前完成运行,则可以选择自动释放,因为它可以很快自动释放掉

如果这个线程运行贯穿系统运行整个期间,则要选择手动释放了

相关阅读 >>

Delphi datasnap http用法注意事项

Delphi ansi与unicode编码互转

Delphi windows 编程[11] - wm_size 消息

Delphi 2009 之 tcategorypanelgroup[2]: headeralignment、gradientdirection

Delphi 系统托盘组件 ttrayicon 简介

Delphi radiogroup 组件基本用法

Delphi 制作资源文件并释放运行

Delphi 检验手机号 ismobilenumber

Delphi一个简单的穿墙下载者

Delphi raise 语句: 抛出异常

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...