[ FranjoZG @ 24.05.2017. 13:14 ] @
Kako zaustaviti task pri gašenju programa?
Kreirao sam tTask koji šalje mail-ove u pozadini programa. Nekada 1, a nekada više.
Ako korisnik želi zatvorio program, a task je još aktivan - javlja grešku. Kako u main formi znati da je task aktivan i kako za zaustaviti prije nego što bi završio sav posao?

Pokušao sam sa task.Cancel, ali ne radi kako treba. Imam osjećaj da iskoči iz taska prije vremena.

imam:
Code:


procedure TfmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
        fTaskMail.Cancel;
        fmPoruka := tfmPoruka.Create(nil);
        fmPoruka.lbPoruka.Caption := 'Prekid slanja mailova u tijeku...';
        while AktTMail > 0 do Sleep(2000);
        CanClose := true;
end;

procedure TfmMain.SendMail;
begin
  fTaskMail := TTask.Run(procedure ()
         var Memo: TfrxMemoView;
       begin
         TInterlocked.Add(AktTMail, 1);
         ...
         while (Dat <= Dat1) and (TTask.CurrentTask.Status <> TTaskStatus.Canceled) do begin
             ...
         end;
         
         TInterlocked.Add(AktTMail, -1);
         TThread.Synchronize(nil, procedure
            begin
               TimerMail.Enabled := not(Ok) and (TTask.CurrentTask.Status <> TTaskStatus.Canceled);
               WriteLog('Ukupno poslano mail-ova: ' + UkBr.ToString, false);
               if (TTask.CurrentTask.Status = TTaskStatus.Canceled) then
                   WriteLog('SLANJE MAIL-OVA JE PREKINUO KORISNIK: ' + UserName, false);
               CloseFile(LogFile);                                      
            end);        



Nakon zatvaranja programa, fTaskMail.Cancel izazov ispadanje iz while petlje i task-a i ne dođe na naredbu: TInterlocked.Add(AktTMail, -1);
Javi mi i grešku da je disconect-ana kontrola sa slanje mail-a.
Varijablu AktMail koristim kako bih znao da je task pokrenut. Ona je 1 ili 0.
U čemu griješim?
[ savkic @ 24.05.2017. 20:41 ] @
> Kreirao sam tTask koji šalje mail-ove u pozadini programa. Nekada 1, a nekada više.
> Ako korisnik želi zatvorio program, a task je još aktivan - javlja grešku. Kako u main formi znati da je
> task aktivan i kako za zaustaviti prije nego što bi završio sav posao?

U principu ti ne treba nesto puno da se bavis tim taskom, tipa signaliziras mu da prekine rad (vidi ima li Terminate method umesto Cancel), sacekas malo (do 1000ms) i samo izadjes. Windows ce sam ubiti task/thread i pocistiti memoriju i sta treba.

> Nakon zatvaranja programa, fTaskMail.Cancel izazov ispadanje iz while petlje i task-a i ne dođe na
> naredbu: TInterlocked.Add(AktTMail, -1);

Dobijes exception? Nesto onda u toj petlji ne radis kako treba.

> Javi mi i grešku da je disconect-ana kontrola sa slanje mail-a.

Da li je ta kontrola za mejl vezana za glavni thread, kako je kreiras i gde?

[ FranjoZG @ 26.05.2017. 09:20 ] @
Hvala na odgovoru. Ja sam bio kriv :) (a tko drugi)... Pozivao sam objekt koji sam prije uništio....