vložil Radek Červinka
24. května 2024 14:34
Jen taková krátká poznámka ze života.
Dělal jsem úkol, kde se spouštělo velké množství tasků, které nezávisejí na pořadí. Prostě jak přijde nový požadavek, tak se převezme a podle případu se vygeneruje x výstupů. Krásná úloha pro TTask a TThreadPool. Fungovalo to nádherně, jen si zákazník přál, aby si mohl regulovat kolik dostane program vláken.
Více...
vložil Radek Červinka
11. května 2023 20:48
Vždycky jsem UDP psal pomocí Synapse, ale chtěl jsem zkusit něco nového a chtěl jsem to pro Android za pomoci inhouse řešení - i když je Synapse pro Android je dostupná.
Server byl existující synapse UDP server (tady je sample public:howto:udpserver) pro windows, který na zaslaný řetezec <ident> vrátil název počítače, takže jsem během chvilky dostal seznam dostupných stanic i s IP adresou pro připojení z Androidího klienta.
Více...
vložil Radek Červinka
5. září 2015 01:27
FastMM4 je geniální. V podstatě ve většině instancí je nepřekonatelný - a že se o to stále někdo pokouší. Ale v případech brutálních vícevláknových (hodně vláken), paměťově intenzivních programů je možné, že FastMM přestane dobře škálovat díky tomu, že své interní struktury chrání spinlocky.
Více...
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).
Více...
vložil Radek Červinka
12. září 2014 23:32
V pokračování minulého článku ukáži pravděpodobně nejčastější použití System.Threading - použití TTask, přidání úlohy do poolu. Příklad jsem si vypůjčil z blogu Embarcadera.
implementation
uses
System.Threading, System.SyncObjs;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
tasks: array of ITask;
value: Integer;
begin
Setlength (tasks, 2);
value := 0;
tasks[0] := TTask.Create (procedure ()
begin
sleep (3000); // 3 seconds
TInterlocked.Add (value, 3000);
end);
tasks[0].Start;
tasks[1] := TTask.Create (procedure ()
begin
sleep (5000); // 5 seconds
TInterlocked.Add (value, 5000);
end);
tasks[1].Start;
TTask.WaitForAll(tasks);
// TTask.WaitForAny(tasks);
ShowMessage ('All done: ' + value.ToString);
end;
Více...
vložil Radek Červinka
10. září 2014 00:39
XE7 přichází s novou jednotkou přímo v RTL a to System.Threading, která zjednodušuje paralelní programování. Jedná se o multiplatformní věc a mezi jinými umí ThreadPool, který podle zátěže přidává nebo odebírá další vlákna.
Více...