双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

为什么线程执行Free后,还能调用它的Terminated属性?

wintergoes wintergoes 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
线程执行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.
...全文

相关推荐

线程处理基本方法

线程定义\线程创建\线程暂停|销毁 创建方法解析:执行方法解析:调用过程:销毁线程(在窗体销毁时):开启系统自动启动线程:(在整个程序创建时,就启动对线程的调用)

rulinzhang

【Java多线程】JUC之自己实现一个简单的线程池(三)-略有所成

前言 上次本人是基于java1.8新特性编写了一个简单的线程池,使用了原子变量、阻塞队列、可重入锁等等新特性,内容全部收录在下面两篇文章中 【Java多线程】自己实现一个简单的线程池(一) 【Java多线程】自己实现一个简单的线程池(二) 这次本人闲的无聊,想通过原生的java方式实现一个简单的线程池 一.简易版实现流程 包含功能: 创建线程池,销毁线程池,添加新任务 没有任务进入等待,有任务则处理掉 动态伸缩,扩容 拒绝策略 因为自己实现的简易版本所以不建议生产中使用,生产中使用java.uti

墩墩分墩

下载 多线程编程技术开发资料 高清完整PDF版

多线程编程技术开发资料.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!

我怀念De

delphi判断线程状态

delphi判断线程状态

ozhy111

VB.NET中的多线程开发

对于使用VB6的开发者而言,要在程序中实现多线程(multi-thread)功能,一般就是使用Win32 API调用。但凡是进行过这种尝试的开发者都会感觉到实现过程非常困难,而且总是会发生些null terminated strings GPF的错误。可是有了VB.NET,一切烦恼都成为过去。

半路和尚
评论 19
收藏 已收藏
分享
返回顶部
wintergoes
Delphi 5,944 成员 262,941 内容