Radmin program koji koristi task-ove i pristupa bazama podataka. Svaki task radi sinhronizaciju lokalnih podataka (FB) sa web-om (MySQL).
Svaki task ima svoju konekciju (definiranu u tasku), koristim TFDConnection.
Taskovi se izvrše. Pritisnem na "Close" main forme, forma nestane s ekrana, ali u procesima se i dalje vidi program.
procedura pokretanja taskova:
Code:
a1 := tMyThreadAdresar.Create(fmMain); // tMyThreadAdresar je klasa definirana u drugom unit-u
...
tt[1] := TTask.Create (procedure ()
begin
a1.ime := 'a1';
a1.MainProcedure := CountActivThread;
a1.ErrorProcedure := ErrorThread;
a1.Log := self.Log;
a1.Params := Param;
a1.Name := 'a1';
a1.Execute;
end);
..
// tako 4 puta tt[1] .. tt[4]
tt[1].Start;
tt[2].Start;
tt[3].Start;
tt[4].Start;
while not TTask.WaitForAll(tt, 1) do begin
// process any pending TThread.Synchronize() and TThread.Queue() requests
CheckSynchronize(0);
// process any pending UI paint requests, but not other messages
Application.MainForm.Update;
// or make it more responsive
Application.ProcessMessages;
end;
if (tt[1].Status <> TTaskStatus.Completed) or
(tt[2].Status <> TTaskStatus.Completed) or
(tt[3].Status <> TTaskStatus.Completed) or
(tt[4].Status <> TTaskStatus.Completed) then
showmessage('nije gotovo')
else begin
ShowMessage('gotovo 1');
end;
a1 := tMyThreadAdresar.Create(fmMain); // tMyThreadAdresar je klasa definirana u drugom unit-u
...
tt[1] := TTask.Create (procedure ()
begin
a1.ime := 'a1';
a1.MainProcedure := CountActivThread;
a1.ErrorProcedure := ErrorThread;
a1.Log := self.Log;
a1.Params := Param;
a1.Name := 'a1';
a1.Execute;
end);
..
// tako 4 puta tt[1] .. tt[4]
tt[1].Start;
tt[2].Start;
tt[3].Start;
tt[4].Start;
while not TTask.WaitForAll(tt, 1) do begin
// process any pending TThread.Synchronize() and TThread.Queue() requests
CheckSynchronize(0);
// process any pending UI paint requests, but not other messages
Application.MainForm.Update;
// or make it more responsive
Application.ProcessMessages;
end;
if (tt[1].Status <> TTaskStatus.Completed) or
(tt[2].Status <> TTaskStatus.Completed) or
(tt[3].Status <> TTaskStatus.Completed) or
(tt[4].Status <> TTaskStatus.Completed) then
showmessage('nije gotovo')
else begin
ShowMessage('gotovo 1');
end;
Program uredno ispiše "gotovo 1"
Nakon toga close forme i ostane visjeti u procesima. Ako ga pokrečem iz Delphi-a, moram koristiti "Program reset" mada forma programa nestane.
Probao sam i bez WaitForAll - ista situacija.
U čemu je štos?