Synchronizace TThread za pomocí anonymních metod

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?

Tagy: , ,

Praxe

Komentáře

22.7.2014 14:46:02 #

Martin

Je to způsob, na který jsem zvyklý z .NETu, takže mě to ani nepřekvapuje.

Martin

22.7.2014 23:22:58 #

Daniel Andrascik

mne sa to velmi paci, velmi casto maju synchronizacne metody dva tri riadky, tak je to pekne v kope

Daniel Andrascik

23.7.2014 16:33:14 #

tz

Líbí. Ale proč nejít ještě dál a nepoužít TThread.CreateAnonymousThread()?

procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      I: Integer;
    begin
      for I := 1 to 30 do
      begin
        TThread.Synchronize(nil,
          procedure
          begin
            Label1.Caption := I.ToString;
          end);

        Sleep(500);
      end;
    end).Start;
end;

tz

23.7.2014 17:17:25 #

radekc

TZ - mnohem lepší, a hlavně odpadá předávání TLabel.

radekc

23.7.2014 23:13:22 #

Daniel Andrascik

TZ - wow to sa da? Tak to sa urcite zide, nestiham sledovat vsetky novinky delphi...

Daniel Andrascik

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců