![]() |
Thread aus Tobjectlist beenden
Hi,
im FormCloseQuery frage ich meine Objectlist ab, on moch Thread vorhanden sind und wenn ja sollen diese sofort beendet werden.
Delphi-Quellcode:
Allerdings alufen die Threads einfach munter weiter.
if FThread_liste.Count <> 0 then Begin
for i := 0 to FThread_liste.Count -1 do begin if Assigned((FThread_liste.Items[i] as TThread)) then (FThread_liste.Items[i] as TThread).Terminate; end; End; |
AW: Thread aus Tobjectlist beenden
Fragen die Threads denn regelmäßig ab, ob sie Terminated wurden? (und beenden sich dann auch!)
|
AW: Thread aus Tobjectlist beenden
Delphi-Quellcode:
[dcc32 Fehler] Form_Main.pas(1662): E2362 Auf protected-Symbol TThread.Terminated kann nicht zugegriffen werden
while not (FThread_liste.Items[i] as TThread).Terminated do
Delay(200); Hm |
AW: Thread aus Tobjectlist beenden
Den Code kann man auch so schreiben
Delphi-Quellcode:
// OwnsObjects sollte True sein
FThread_liste.Clear; Zitat:
Der Code zeigt allerdings auch, dass du das eben nicht machst, da du augenscheinlich nicht weißt, wo und wozu man das benutzt.
Delphi-Quellcode:
procedure TMyThread.Execute;
begin inherited; while not Terminted do begin // tue was hier immer wieder ohne Unterlass, ok bis eben Terminated end; end; |
AW: Thread aus Tobjectlist beenden
Sir Rufo, das versteh ich nun nicht so ganz, was hat das damit zu tun das der Thread beendet werden soll?
Oder gibt die Liste dann die Threads automatisch frei? Edit: hab ich eben ausprobiert, thread abeit dennoch weiter. |
AW: Thread aus Tobjectlist beenden
Zitat:
Eine
Delphi-Quellcode:
mit
TObjectList
![]()
Delphi-Quellcode:
verwaltet die Instanzen des Inhaltes selber und bei
True
Delphi-Quellcode:
werden alle Instanzen (in der Liste) freigegeben.
Clear
Ein Thread wird im destructor beendet (Terminate) und die Instanz verschwindet im Nirwana ... ... wenn der Thread-Code auch wirklich aufhört |
AW: Thread aus Tobjectlist beenden
Zitat:
![]()
Delphi-Quellcode:
for i := 0 to FThread_liste.Count - 1 do
if Assigned(FThread_list.Items[i]) and (FThread_list.Items[i] is TThread) then (FThread_liste.Items[i] as TThread).Terminate;
Delphi-Quellcode:
und das Resultat
program dp_180889;
{$APPTYPE CONSOLE} {$R *.res} uses {System} SysUtils, Contnrs, Classes; type TTestThread = class( TThread ) protected procedure Execute; override; end; { TTestThread } procedure TTestThread.Execute; begin inherited; while not Terminated do begin Sleep( 50 ); // immer nur ein wenig schlafen, bis eben Terminated ... end; end; {$DEFINE UNSICHER} procedure Test; var LList : TObjectList; LIdx : Integer; begin LList := TObjectList.Create( True ); try LList.Add( TTestThread.Create( False ) ); LList.Add( nil ); LList.Add( TObject.Create ); // Eine einfache TObject-Instanz LList.Add( TTestThread.Create( False ) ); {$IFDEF UNSICHER} write( 'UNSICHER: ' ); {$ELSE} write( 'SICHER: ' ); {$ENDIF} for LIdx := 0 to LList.Count - 1 do begin write( LIdx, '...' ); {$IFDEF UNSICHER} if Assigned( LList.Items[LIdx] as TThread ) {$ELSE} if Assigned( LList.Items[LIdx] ) and ( LList.Items[LIdx] is TThread ) {$ENDIF} then // Threads mitteilen, dass sie sich beenden sollen ( LList.Items[LIdx] as TThread ).Terminate; end; Writeln( 'Fertig' ); LList.Clear; // Wenn der Befehl durch ist, dann sind auch alle Threads beendet finally LList.Free; end; end; begin try Test; except on E : Exception do Writeln( E.ClassName, ': ', E.Message ); end; Readln; end.
Code:
UNSICHER: 0...1...2...EInvalidCast: Ungültige Typumwandlung
SICHER: 0...1...2...3...Fertig |
AW: Thread aus Tobjectlist beenden
Wenn Du auf 'is' abfragst, kannst Du hart casten. Das Pattern
Delphi-Quellcode:
Zusätzlich sollte man noch darauf hinweisen (auch wenn es eigentlich selbstverständlich ist), das ein Thread in seiner Execute-Methode 'immer mal wieder' auf 'Terminated' prüfen sollte, d.h. auch in inneren Schleifen. Die 'Terminate' Methode beendet den Thread nämlich überhaupt nicht, sondern setzt nur das Flag 'Terminated' auf True.
if (foo is TBar) then
TBar(foo).... // Ist genauso sicher wie(aber wesentlich schneller als) if (foo is TBar) then (foo as TBar).... Die Methode sollte also besser heißen: 'TerminateRequest', oder auf deutsch: 'SachDenFredErSollSichMaBeendenAberErMussDasSchonA uchMerkenNe'; |
AW: Thread aus Tobjectlist beenden
Ah ok, jetzt versteh ich es. Danke
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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-2025 by Thomas Breitkreuz