我的应用程序需要一个后台线程。如果被触发,它将简单地对 SQL 数据库进行一些查询并更新另一个 Table 。为了简单起见,我为自己构建了一个测试项目来测试我的想法。我想出了以下代码:
unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TBackGroundThread = class(TThread)
protected
procedure Execute; override;
end;
type
TMain = class(TForm)
Memo1: TMemo;
btnStartThread: TButton;
Memo2: TMemo;
procedure btnStartThreadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
var
BackGroundThread : TBackGroundThread;
SafeToStart : boolean;
procedure ShowID;
public
{ Public declarations }
end;
var
Main: TMain;
implementation
{$R *.dfm}
procedure TBackGroundThread.Execute;
begin
Main.SafeToStart:=false;
Main.ShowID;
Main.SafeToStart:=true;
end;
procedure TMain.FormCreate(Sender: TObject);
begin
SafeToStart:=true;
end;
procedure TMain.ShowID;
var i : integer;
begin
for i := 0 to 10 do
begin
sleep(100);
end;
Memo1.Lines.Add(IntToStr(BackGroundThread.ThreadID));
Main.SafeToStart:=true;
end;
procedure TMain.btnStartThreadClick(Sender: TObject);
begin
if SafeToStart = true then
begin
BackGroundThread := TBackGroundThread.Create(false);
BackGroundThread.FreeOnTerminate:=true;
end
else
begin
Memo2.Lines.Add('OOPS' +IntToStr(BackGroundThread.ThreadID));
end;
end;
end.
我正在使用私有全局变量来检查是否可以启动,我认为这应该是安全的,因为我只有一个后台任务。Execute 将在 try except end 块内。
我试图检查我是否有内存泄漏,但 Delphi 没有报告任何问题。
我的问题是:
如果我将 FreeOnTerminate 属性设置为 true,那么在执行后线程会自动释放自己吗?
谢谢你。
更新 1
至于线程内的 VCL 操作,我将使用它:
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
seriesQM.AddXY(qryStat.FieldByName('CurrentPeriod').AsDateTime,qryStat.FieldByName('GesCutQM').AsFloat,
qryStat.FieldByName('Hour').AsString,$00FF9F40);
end);