Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi XE 10.1 TTask

[es] :: Pascal / Delphi / Kylix :: Delphi XE 10.1 TTask

[ Pregleda: 810 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 245
*.adsl.net.t-com.hr.



+2 Profil

icon Delphi XE 10.1 TTask24.05.2017. u 13:14 - pre 40 meseci
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?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2638



+69 Profil

icon Re: Delphi XE 10.1 TTask24.05.2017. u 20:41 - pre 40 meseci
> 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?


 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 245
*.adsl.net.t-com.hr.



+2 Profil

icon Re: Delphi XE 10.1 TTask26.05.2017. u 09:20 - pre 40 meseci
Hvala na odgovoru. Ja sam bio kriv :) (a tko drugi)... Pozivao sam objekt koji sam prije uništio....
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi XE 10.1 TTask

[ Pregleda: 810 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.