0

我的应用程序需要一个后台线程。如果被触发,它将简单地对 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);
4

0 回答 0