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.