Delphi - 从线程更新状态栏

时间:2013-06-14 04:44:17

标签: multithreading delphi

从一个tthread类对象更新mainform中状态栏的最佳方法是什么。 例如,我有一个TThread对象,它可以生成一个非常大的数量的东西,我希望根据您在状态栏上显示的软件显示详细消息。

1 个答案:

答案 0 :(得分:8)

使用对回调方法的引用创建线程,如果已分配,则可以将其称为synchonized。

实施例

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TInfoMessageCall=Procedure (const info:String) of object;

  TMyThread=Class(TThread)
    Constructor Create(Susp:Boolean;CallBack:TInfoMessageCall);overload;
    Procedure Execute;override;
    private
    FMessage:String;
    FInfoProc:TInfoMessageCall;
    Procedure CallCallBack;

  End;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ACallBack(const s: String);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

Procedure TForm1.ACallBack(Const s:String);
begin
  Caption := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  With TMyThread.Create(false,ACallBack) do
    FreeOnTerminate := true;
end;


procedure TMyThread.CallCallBack;
begin
  if Assigned(FInfoProc) then  FInfoProc(FMessage);
end;

constructor TMyThread.Create(Susp: Boolean; CallBack: TInfoMessageCall);
begin
   Inherited Create(Susp);
   FInfoProc := CallBack;
end;

procedure TMyThread.Execute;
var
 i:Integer;
begin
  inherited;
    for I := 1 to 10 do
          begin
            FMessage := Format('Info %d',[i]);
            Synchronize(CallCallBack);
            Sleep(200);
          end;
end;


end.