Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Threads in Listen halten (https://www.delphipraxis.net/192254-threads-listen-halten.html)

Hobbycoder 3. Apr 2017 17:03

Threads in Listen halten
 
Hi,

ich möchte unterschiedliche Threads in einer TList halten.

z.B.
Delphi-Quellcode:
ThreadA=class(TThread)
ThreadB=class(TThread)
ThreadC=class(TThread)
Die Thread tragen sich selbst beim Starten in eine TList ein und beim Beenden wieder aus.

Jetzt möchte ich bei Programmende alle noch verbliebenen Thread terminieren.

Allerdings kann ich wohl nicht mit
Delphi-Quellcode:
as TThread
arbeiten, denn die IDE bietet mir bei
Delphi-Quellcode:
(TList.items[i] as TThread).
kein Terminate an. Auch über die API function TerminateThread geht's zumindest nicht so einfach, weil ich dazu das Handle brauche.
Jetzt könnte ich natürlich auch das Händle in einer TList ablegen, aber mir gefiel dieser Weg erst mal besser, weil ich dann die TList auch noch anderweitig verwenden will.
Meine Frage, warum kann ich bei Threads nicht auf die Mutterklasse casten?
Welche elegante Lösung gibt es?

Gruß Hobbycoder

Der schöne Günther 3. Apr 2017 17:08

AW: Threads in Listen halten
 
Zitat:

Zitat von Hobbycoder (Beitrag 1366290)
IDE bietet mir bei (TList.items[i] as TThread). kein Terminate an.

Uh, ganz sicher?

Hobbycoder 3. Apr 2017 17:21

AW: Threads in Listen halten
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1366291)
Uh, ganz sicher?

Nun, wenn jemand Du diese Gegenfrage stellt......nicht mehr so ganz.:wink::wink:

Aber der Compilert meckert mir das
Delphi-Quellcode:
    (TL.Items[0] as TThread).Terminate; //TL ist TList
mal mit der Fehlermeldung
Code:
E2015: Operator ist auf diesen Operandentyp nicht anwendbar

himitsu 3. Apr 2017 17:28

AW: Threads in Listen halten
 
Wobei er da nicht wegen dem Terminate, sondern wegen des AS meckert. :zwinker:

Delphi-Quellcode:
(TObject(TL.Items[0]) as TThread).Terminate;

TThread(TL.Items[0]).Terminate;
AS auf einen Pointer anstatt auf eine Objektvariable.

Pssst: TObjectList :roll:



Mit den Generics sieht das ganze auch ganz nett aus.

Delphi-Quellcode:
var TL: TList<TThread>;

TL.Items[0].Terminate;

TL[0].Terminate;

Der schöne Günther 3. Apr 2017 17:30

AW: Threads in Listen halten
 
Delphis Compiler-Meldungen sind mal wieder super-hilfreich. Was er dir sagen möchte: Er kommt mit dem
Delphi-Quellcode:
  (TL.Items[0] as TThread)
nicht zurecht. Die TList gibt dir nur Pointer. Das könnte ein Zeiger auf alles sein. Und wenn es z.B. auf einen
Delphi-Quellcode:
Integer
(oder Müll im Speicher) zeigt kannst du darauf kein
Delphi-Quellcode:
as
machen.

Du musst entweder dem Compiler sagen "Ich weiß was ich tue, das ist garantiert ein Zeiger auf einen TThread" und somit:

Delphi-Quellcode:
TThread(TL.Items[0]).Terminate();
Oder du gehst von dieser schrecklichen
Delphi-Quellcode:
TList
weg und nimmst eine
Delphi-Quellcode:
TList<TThread>

Hobbycoder 3. Apr 2017 18:43

AW: Threads in Listen halten
 
Wieder was gelernt.

Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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