Aktualizace UI z threadu

vložil Radek Červinka 10. prosince 2014 22:32

Už dříve jsem psal o možnosti volání synchronize přes anonymní metodu z threadu (tj. synchronní možnost), ale teď Malcolm Groves v článku Updating the UI from a Task publikoval i asynchronní možnost takže má další pěkný příspěvek, který jsem sprostě okopíroval (zároveň i doplnění mé odpovědi Geby).

Synchronně

V podstatě vylepšení klasického TThread.Synchronize.

procedure TFormThreading.Button1Click(Sender: TObject);
var
  aTask: ITask;
begin
  aTask := TTask.Create(procedure
                        begin
                          sleep (5000);
                          TThread.Synchronize(nil,
                                              procedure
                                              begin
                                                ShowMessage ('Hello');
                                              end);
                        end);
  aTask.Start;
end;

Asynchronně

procedure TFormThreading.Button1Click(Sender: TObject);
var
  aTask: ITask;
begin
  aTask := TTask.Create(procedure
                        begin
                          sleep (5000);
                          TThread.Queue(nil,
                                        procedure
                                        begin
                                          ShowMessage ('Hello');
                                        end);
                        end);
  aTask.Start;
end;

V tomto případě je anonymní metoda dána do fronty a brzo v budoucnosti je provedena z kontextu hlavního vlákna. Tím pádem neblokuje provádění a za druhé výpočetní vlákno nemusí čekat až má hlavní vlákno čas.

Představuji si to např. tak, že vlákno něco počítá a v určité fázi dejme tomu nastavuje nějakou položku v ListView, zatímco výpočet dále pokračuje. Pokud bych použil Synchronize tak prováděcí vlákno musí čekat, až bude mít hlavní vlákno čas updatovat GUI, zatímco v případě Queue jen prostě dám požadavek a počítám si v klidu dál a až bude mít GUI čas, tak se to prostě provede. Tedy tak si to aspoň představuji.

Tagy: , ,

Praxe

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ů