AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi System.Threading: Kann man einen Task / Threadpool beenden?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "himitsu"
Ein Thema von Der schöne Günther · begonnen am 14. Jan 2015 · letzter Beitrag vom 23. Mär 2016
Antwort Antwort
Seite 2 von 2     12   
Der schöne Günther

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

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

  Alt 16. Jan 2015, 09:32
Das wäre fein. Und kein Problem. Schreibe einfach einen Wrapper um die Win-API die [...]
Habe ich auch schon längst

Ich wollte ja nur wissen "Kann System.Threading den bestehenden Kram ersetzen?". Die Antwort war nein.
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 23. Mär 2016, 11:42
Ich bin aber ehrlich gesagt immer noch nicht ganz zufrieden mit der Sache. Folgendes Beispiel, einmal ein Piep-Thread, und ein Piep-Task.

Delphi-Quellcode:
unit Unit3;

interface uses
   System.Classes,
   Vcl.Controls, Vcl.Forms, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
   startTaskButton: TButton;
   startThreadButton: TButton;
   procedure startTaskButtonClick(Sender: TObject);
   procedure startThreadButtonClick(Sender: TObject);
  end;

var
  Form3: TForm3;

implementation uses System.Threading, System.SysUtils;

{$R *.dfm}

procedure proc();
const
   maxCount = 10;
var
   count: Integer;
begin
   count := 0;
   repeat
      Beep();
      Inc(count);
      Sleep(500);
   until (count = maxCount);
end;

procedure TForm3.startTaskButtonClick(Sender: TObject);
begin
   TTask.Run(proc);
end;

procedure TForm3.startThreadButtonClick(Sender: TObject);
begin
   TThread.CreateAnonymousThread(proc).Start();
end;

end.
Einmal Button drücken, dann Anwendung beenden. Der Thread wird durch Halt vernünftig vorzeitig beendet. Der Task arbeitet seine zehn Piepser immer ab.

Ausprobiert mit XE7. Ist das mit 10 Seattle immer noch so? Ich finde das ehrlich gesagt gruselig.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

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

  Alt 23. Mär 2016, 11:49
Ist so ... Emba hat das Abbrechen von Tasks nicht so richtig auf dem Schirm gehabt.

Generell musst du für einen abbrechbaren Task den Abbruch aber auch selber behandeln. Der anonyme Thread wird einfach so beendet, was auch nicht die feine englische Art ist
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 23. Mär 2016, 12:07
Natürlich sollte ich das. Mich ärgert halt ziemlich dass, sollte ich in einem Task einen dummen Fehler machen, er nie terminiert, man die Anwendung nur noch über den Taskmanager abschießen kann.

In System.Threading.pas steht sogar // Check each thread to see if it is already marked for termination and/or if it is hung. , aber geprüft wird da gar nichts. Einfach Destroy() auf allen Threads aufrufen, nur leider steht da

Delphi-Quellcode:
destructor TThreadPool.TBaseWorkerThread.Destroy;
begin
  if FRunningEvent <> nil then
    FRunningEvent.WaitFor(INFINITE); // This waits for the Execute to actually be called.

Im Endeffekt läuft es darauf hinaus, dass ich mich nicht traue System.Threading zu verwenden und weiterhin mir selbst immer Threads zusammenfummeln werde. Echt schade.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#15

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

  Alt 23. Mär 2016, 12:55
Destroy setzt auch Terminated auf True und genau das mußt du auch prüfen, in deinen Threads.
Bei Anonymen Threads kann man sich das Threadobjekt holen if TThread.CurrentIrengwas.Terminated then raus; .
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 23. Mär 2016, 13:00
Ja, in einem Task kann ich prüfen ob der "Current" Thread nicht eigentlich beendet werden soll

Delphi-Quellcode:
procedure proc();
begin
   repeat
      Beep();
      TTask.CurrentTask.CheckCanceled(); // Bringt nichts
      if TThread.Current.CheckTerminated() then Break; //Das hier bringt's
      Sleep(500);
   until False;
end;
Wie gesagt, mir geht es aber um den Fall dass im Code ein dummer Fehler ist dass er nie terminiert. Ein Deadlock, sonst was. Benutze ich die Task-Library, wird sich die Anwendung niemals beenden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#17

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

  Alt 23. Mär 2016, 15:07
Threads/Tasks dürfen sich IMMER nur selber "definiert" beenden/anhalten.

Einfaches Beispiel: Der Thread macht grade beim Speichermanager eine Anfrage oder spielt mit Strings/Arrays rum ... wenn dabei der Thread extern beendet wird, kann das komplette Programm (alle Threads) blockieren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 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