vložil Radek Červinka
21. července 2014 23:32
Před několika verzemi byla metoda TThread.Synchronize rozšířena o několik možností volání, mezi jinými i anonymní metody. Nepřikládal jsem tomu moc význam, ale poslední dobou jsem to viděl v několika projektech a nabývám dojmu, že to má větší možnosti než jsem si myslel.
Mějme na formuláři tlačítko a label. Tlačítko spustí vlákno a do labelu bude bezpečně z něho zapisováno.
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
type
TMyThread = class (TThread)
private
FLabel: TLabel;
public
constructor Create(lbl: TLabel);
protected
procedure Execute; override;
end;
implementation
{$R *.dfm}
{ TMyThread }
constructor TMyThread.Create(lbl: TLabel);
begin
FLabel := lbl;
inherited Create(False);
end;
procedure TMyThread.Execute;
var
i: Integer;
begin
i := 0;
repeat
inc(i);
Synchronize(
procedure begin
FLabel.Caption := IntToStr(i);
end);
Sleep(500);
until Terminated or (i > 30);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(Label1).FreeOnTerminate := True;
end;
Mějme tedy třídu TMyThread, která ve své metodě Execute počítá a stav přes anonymní metodu synchronizuje (aktualizuje) do TLabel. Jádro příkladu je
Synchronize(
procedure begin
FLabel.Caption := IntToStr(i);
end);
tj. přiřazení a aktualizace Labelu je z kontextu hlavního vlákna. Osobně se mi to líbí. Zbytek jsou už pak jen opičky.
Názory?