[ FranjoZG @ 29.01.2017. 22:38 ] @
Delphi 10.1 Berlin
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;


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?


[ savkic @ 30.01.2017. 01:35 ] @
Odakle pozivas ovu metodu?

Uglavnom, problem je sto ti ostaju aktivni threadovi, sad ne znam da li su to ovi taskovi ili neki drugi.
Mozes downloadovati SysInternals ProcExplorer (TaskManager sa dosta vise mogucnosti), startujes ga i selektujes tvoj proces pa pogledas threadova pre nego startujes taskove, vidis koji se naprave, potom radis u programu, zatvoris ga i pogledas koji threadovi su ostali zivi.
[ salvaric @ 30.01.2017. 07:42 ] @
Pokušaj da ukloniš
Code:
 Application.ProcessMessages;
meni je to pravilo probleme u radu sa Thread-ovima.

Prebaci događaj na neki "Button" da ne gasiš program, pokreni View->Debug Windows->Threads i pokreni program, prati thread-ove nakon pritiska na "Button" i isprati dal ti se svaki uklonio nakon izvršenja.
[ captPicard @ 31.01.2017. 19:37 ] @
Franjo pogledaj PM kada stigneš :)