Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

System.Threading: Kann man einen Task / Threadpool beenden?

  Alt 14. Jan 2015, 20:17
Es ist im Endeffekt die gleiche wie eine meiner ersten Fragen hier:
http://www.delphipraxis.net/173890-w...gewaltsam.html
Nur diesmal auf System.Threading bezogen:

Kann ich einen Task, im worst case-Szenario, richtig abbrechen? Richtig tot machen?

Ein einfaches Cancel() setzt vielleicht im Task-Objekt ein Flag, aber terminiert wird der entsprechende Thread dadurch nicht:
Delphi-Quellcode:
procedure justTaskingThings();
var
   myTask: ITask;
begin
   myTask := TTask.Run(
      procedure
      begin
         sleep(5000);
         WriteLn('Task finished');
      end
   );

   sleep(1000);
   WriteLn('cancelling task');
   myTask.Cancel();
end;
Erst schläft er sich noch richtig aus, dann wird die Zeile WriteLn('Task finished'); ganz normal ausgeführt.
Ich dachte dann, es könnte helfen, explizit einen eigenen TThreadPool dafür auf zu machen und diesen dann zu beenden:

Delphi-Quellcode:
procedure justThreadingThings();
var
   myTask: ITask;
   pool: TThreadPool;
begin
   pool := TThreadPool.Create();
   try

      myTask := TTask.Run(
         procedure
         begin
            while True do TThread.Yield();
         end,
         pool
      );

      myTask.Wait(100);
      WriteLn('cancelling task');
      myTask.Cancel();
   finally
      WriteLn('destroying pool');
      pool.Free();
   end;
   Writeln('pool is closed');
end;
Diese Anwendung wird nie beendet werden da der TThreadPool-Destruktor ewig hängt denn er wird auf den blockierenden Thread warten.


Ich finde keine Lösung. Gibt es überhaupt eine?
  Mit Zitat antworten Zitat