为什么线程执行Free后,还能调用它的Terminated属性?
线程执行Free后内存不是已经释放掉了吗?为什么还能调用它的Terminated属性,还可以调用其他的一些自定义属性.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TTestThread = class(TThread)
private
procedure DrawLine;
procedure Execute; override;
public
FStr: string;
destructor Destroy; override;
end;
type
TForm1 = class(TForm)
imgTest: TImage;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
edtFreeTest: TEdit;
lstThreadHandle: TListBox;
Button8: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
private
FTestThread: TTestThread;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TTestThread }
destructor TTestThread.Destroy;
begin
FStr := 'Is Destroyed';
inherited;
end;
procedure TTestThread.DrawLine;
var
I, J: Integer;
begin
Form1.imgTest.Canvas.FillRect(Form1.imgTest.Canvas.ClipRect);
for I := 0 to Form1.imgTest.Width do
begin
for J := 0 to Form1.imgTest.Height do
begin
Application.ProcessMessages ;
Randomize;
Form1.imgTest.Canvas.Pixels[I, J] := RGB(Random(255), Random(255), Random(255));
end;
end;
end;
procedure TTestThread.Execute;
begin
inherited;
while not Terminated do
begin
Synchronize(DrawLine);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FTestThread := TTestThread.Create(True);
FTestThread.FreeOnTerminate := True;
FTestThread.FStr := 'Runing';
FTestThread.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FTestThread.Terminate;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if Assigned(FTestThread) then
ShowMessage('Thread is not nil')
else
ShowMessage('Thread is nil')
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if FTestThread.Terminated then
ShowMessage('Thread is Terminate')
else
ShowMessage('Thread is not Terminate')
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
ShowMessage(FTestThread.FStr);
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
lstThreadHandle.Items.Add(IntToStr(Integer(@FTestThread.Handle)));
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TTestThread = class(TThread)
private
procedure DrawLine;
procedure Execute; override;
public
FStr: string;
destructor Destroy; override;
end;
type
TForm1 = class(TForm)
imgTest: TImage;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
edtFreeTest: TEdit;
lstThreadHandle: TListBox;
Button8: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
private
FTestThread: TTestThread;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TTestThread }
destructor TTestThread.Destroy;
begin
FStr := 'Is Destroyed';
inherited;
end;
procedure TTestThread.DrawLine;
var
I, J: Integer;
begin
Form1.imgTest.Canvas.FillRect(Form1.imgTest.Canvas.ClipRect);
for I := 0 to Form1.imgTest.Width do
begin
for J := 0 to Form1.imgTest.Height do
begin
Application.ProcessMessages ;
Randomize;
Form1.imgTest.Canvas.Pixels[I, J] := RGB(Random(255), Random(255), Random(255));
end;
end;
end;
procedure TTestThread.Execute;
begin
inherited;
while not Terminated do
begin
Synchronize(DrawLine);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FTestThread := TTestThread.Create(True);
FTestThread.FreeOnTerminate := True;
FTestThread.FStr := 'Runing';
FTestThread.Resume;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FTestThread.Terminate;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if Assigned(FTestThread) then
ShowMessage('Thread is not nil')
else
ShowMessage('Thread is nil')
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if FTestThread.Terminated then
ShowMessage('Thread is Terminate')
else
ShowMessage('Thread is not Terminate')
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
ShowMessage(FTestThread.FStr);
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
lstThreadHandle.Items.Add(IntToStr(Integer(@FTestThread.Handle)));
end;
end.
...全文
相关推荐
线程处理基本方法
线程定义\线程创建\线程暂停|销毁 创建方法解析:执行方法解析:调用过程:销毁线程(在窗体销毁时):开启系统自动启动线程:(在整个程序创建时,就启动对线程的调用)
【Java多线程】JUC之自己实现一个简单的线程池(三)-略有所成
前言 上次本人是基于java1.8新特性编写了一个简单的线程池,使用了原子变量、阻塞队列、可重入锁等等新特性,内容全部收录在下面两篇文章中 【Java多线程】自己实现一个简单的线程池(一) 【Java多线程】自己实现一个简单的线程池(二) 这次本人闲的无聊,想通过原生的java方式实现一个简单的线程池 一.简易版实现流程 包含功能: 创建线程池,销毁线程池,添加新任务 没有任务进入等待,有任务则处理掉 动态伸缩,扩容 拒绝策略 因为自己实现的简易版本所以不建议生产中使用,生产中使用java.uti
下载 多线程编程技术开发资料 高清完整PDF版
多线程编程技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
delphi判断线程状态
delphi判断线程状态
VB.NET中的多线程开发
对于使用VB6的开发者而言,要在程序中实现多线程(multi-thread)功能,一般就是使用Win32 API调用。但凡是进行过这种尝试的开发者都会感觉到实现过程非常困难,而且总是会发生些null terminated strings GPF的错误。可是有了VB.NET,一切烦恼都成为过去。



