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);
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?