Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prüfen auf ITask.Status (https://www.delphipraxis.net/206550-pruefen-auf-itask-status.html)

TigerLilly 5. Jan 2021 10:32

Prüfen auf ITask.Status
 
Ich habe in einem TForm so was:
Code:
Task : ITask;
....
Task:=TTask.Run();
Beim Schließen des Formulars möchte ich prüfen, ob der Task läuft, um ihn abzubrechen:
Code:
if Task.Status = TTaskStatus.Running then
  Task.Cancel;
1) Das geht aber nur, wenn der Task läuft, wenn er gar nicht gestartet wurde, kann ich nicht auf Task.Status zugreifen. Wie kann ich prüfen, ob es den Task gibt?
2) Das Beenden des Tasks dauert uU ein bisschen - wie kann ich warten, bis der Task beendet ist?

Danke für Erleuchtung!

Der schöne Günther 5. Jan 2021 10:40

AW: Prüfen auf ITask.Status
 
Was heißt "nicht auf Status zugreifen können"? Wenn er noch nicht gestartet wurde ist er entweder
Delphi-Quellcode:
TTaskStatus.Created
oder
Delphi-Quellcode:
TTaskStatus.WaitingToRun
.

"Warten bis der Task beendet ist" entspricht
Delphi-Quellcode:
WaitFor(..)
:


Delphi-Quellcode:
const
   runningStates = [TTaskStatus.Running, TTaskStatus.WaitingForChildren];
begin
   if Assigned(asyncRefreshTask) then
      begin
         asyncRefreshTask.Cancel();
         try
            if (asyncRefreshTask.Status in runningStates) then
               asyncRefreshTask.Wait(delayTimeMs);
         except
            // make a smug face
         end;
         asyncRefreshTask := nil;
      end;
end;

Rollo62 5. Jan 2021 11:05

AW: Prüfen auf ITask.Status
 
Oder mit TEvent als Koordinator ...
http://docwiki.embarcadero.com/RADSt...o_Be_Completed

TigerLilly 5. Jan 2021 11:36

AW: Prüfen auf ITask.Status
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1480343)
Was heißt "nicht auf Status zugreifen können"? Wenn er noch nicht gestartet wurde ist er entweder
Delphi-Quellcode:
TTaskStatus.Created
oder
Delphi-Quellcode:
TTaskStatus.WaitingToRun
.

"Warten bis der Task beendet ist" entspricht
Delphi-Quellcode:
WaitFor(..)
:


Delphi-Quellcode:
const
   runningStates = [TTaskStatus.Running, TTaskStatus.WaitingForChildren];
begin
   if Assigned(asyncRefreshTask) then
      begin
         asyncRefreshTask.Cancel();
         try
            if (asyncRefreshTask.Status in runningStates) then
               asyncRefreshTask.Wait(delayTimeMs);
         except
            // make a smug face
         end;
         asyncRefreshTask := nil;
      end;
end;

Prüfen mit Assigned ist natürlich eine Lösung, da hast recht.
Wait nach Cancel liefert: EOperationCancelled with message 'Vorgang abgebrochen'. Wait wartet nur auf nicht abgebrochene Tasks. Dein
Try/Except schluckt diese Exception.
Und: Sobald Cancel aufgerufen wird, ist der Status des Tasks Canceled.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz