Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 2 odgovora
  • 1.606 pregleda

Najnovija ↓

Delphi XE 10.1 TTask 24.05.2017. u 14:14 · pre 114 meseci #1
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?
Re: Delphi XE 10.1 TTask 24.05.2017. u 21:41 · pre 114 meseci #2
> 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?

Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Delphi XE 10.1 TTask 26.05.2017. u 10:20 · pre 114 meseci #3
Hvala na odgovoru. Ja sam bio kriv :) (a tko drugi)... Pozivao sam objekt koji sam prije uništio....
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme