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?