![]() |
TTask wird nicht beendet
Guten Morgen,
ich habe zwei TTasks in meinem Programm. Wird das Programm beendet laufen die Tasks weiter. Gibt es noch eine andere Möglichkeit als einen Task mit Cancel zu beenden. Wird cancel ausgeführt, ist der Task anschliessend nil - die Routine läuft aber weiter. Hat wer eine Idee dazu?
Delphi-Quellcode:
Grüße und bleibt gesund
type
TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } taskA: ITask; taskB: ITask; procedure A; procedure B; public { Public declarations } end; //------------- procedure TForm1.A; begin while true do begin sleep(10); end; end; procedure TForm1.B; var i: Cardinal; begin while not TThread.CurrentThread.CheckTerminated do begin sleep(50); inc(i); TThread.Queue(TThread.CurrentThread, procedure begin edit1.Text := format('%d %d',[integer(TThread.CurrentThread), i]); end); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin taskA.Cancel; taskB.Cancel; end; procedure TForm1.FormCreate(Sender: TObject); begin taskA := TTask.Create(procedure begin A; end); taskA.Start; taskB := TTask.Create(procedure begin B; end); taskB.Start; end; Klaus |
AW: TTask wird nicht beendet
Delphi-Quellcode:
So von Prinzip her, ich würde die FThreadsActive dann aber nur mit Interlocked/Atomic Funktionen anfassen.
procedure TForm1.A;
begin while FThreadsActive do begin sleep(10); end; end; procedure TForm1.B; var i: Cardinal; begin while FThreadsActive and not TThread.CurrentThread.CheckTerminated do begin sleep(50); inc(i); TThread.Queue(TThread.CurrentThread, procedure begin edit1.Text := format('%d %d',[integer(TThread.CurrentThread), i]); end); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FThreadsActive := False; end; |
AW: TTask wird nicht beendet
Danke - das Leben kann so einfach sein.
Aus dem Task bzw. deren Taskprocedure kann ich nicht erfahren ob der Task beendet wurde. Es gibt da noch die Methode checkCanceled - aber dazu muss die Routine wissen von welchem Task sie gestartet wurde. Grüße Klaus |
AW: TTask wird nicht beendet
Klar kannst du das
![]() |
AW: TTask wird nicht beendet
Danke Günter.
Delphi-Quellcode:
ich denke, ich werde es dann so machen.
procedure TForm1.A;
var stopped: Boolean; begin stopped := false; while not stopped do begin try TTask.CurrentTask.CheckCanceled; except on EOperationCancelled do stopped := true; end; sleep(10); end; end; procedure TForm1.B; var i: Cardinal; stopped: Boolean; begin stopped := false; while not stopped and not TThread.CurrentThread.CheckTerminated do begin try TTask.CurrentTask.CheckCanceled; except on EOperationCancelled do stopped := true; end; sleep(50); inc(i); TThread.Queue(TThread.CurrentThread, procedure begin edit1.Text := format('%d %d',[integer(TThread.CurrentThread), i]); end); end; end; Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz