![]() |
Delphi-Version: 2005
Überschreiben von TThread.Terminate
Ich stehe gerade vor folgendem "Problem". Ein wirkliches Problem ist es nicht, da ich Alternativen habe, es zu umgehen, trotzdem würde ich gerne wissen, warum mein erster Ansatz so nicht funktioniert.
Ich habe eine eigene Thread-Klasse geschrieben, die (logischerweise) von TThread abgeleitet ist. Ich möchte gerne die Methode TThread.Terminate aus dem public-Bereich überschreiben, weil bei deren Aufruf intern in meiner eigenen Thread-Klasse noch etwas mehr passieren soll, als nur das FTerminated-Feld auf True zu setzen. Aber auch das soll natürlich weiterhin passieren. Daher habe ich TThread.Terminate folgendermaßen überschrieben:
Delphi-Quellcode:
Das Problem ist, dass TThread.Terminate scheinbar übersprungen wird und von dem inherited nicht aufgerufen. Ein Breakpoint innerhalb von TThread.Terminate wird grün dargestellt und deshalb beim Debuggen auch nie erreicht. Woran liegt das? Kann man TThread.Terminate nicht überschreiben und falls nicht, warum?
interface
type TMeinThread = class(TThread) private ... public procedure Terminate; // override hier ja nicht nötig, da nicht virtual end; implementation procedure TMeinThread.Terminate; begin // TThread.Terminate aufrufen, um FTerminated auf True zu setzen inherited; // anschließend noch alles weitere machen ... end; end. Danke für die Aufklärung :) |
AW: Überschreiben von TThread.Terminate
Die Antwort hast du schon selber gegeben durch deinen Kommentar hinter Terminate.
Wenn intern Terminate aufgerufen wird, dann wird das TThread.Terminate aufgerufen und nicht TMeinThread.Terminate. Dazu müsste die Methode in TThread schon virtual sein. |
AW: Überschreiben von TThread.Terminate
Delphi-Quellcode:
Genau falsch ... es muß heißen
// override hier ja nicht nötig, da nicht virtual
"override hier ja nicht möglich, da nicht virtual" Heißt also, du kannst es nicht überschreiben Und TThread ruft nur das ihm bekannte Terminate auf (deines kennt er nicht). Wie wäre es mit einem Eventhandler für OnTerminate? |
AW: Überschreiben von TThread.Terminate
Zitat:
Virtuelle Methoden sind ja nur wichtig, wenn von deiner Elternklasse in eine deiner Methoden gesprungen werden soll. Aber Terminate ruft man ja nur von außen auf, deswegen einfach verdecken, fertsch. |
AW: Überschreiben von TThread.Terminate
Zitat:
|
AW: Überschreiben von TThread.Terminate
Zitat:
Zitat:
Zitat:
|
AW: Überschreiben von TThread.Terminate
Wenn nich virtuell dann gibt es auch keine VMT
|
AW: Überschreiben von TThread.Terminate
Zitat:
Aber ein kurzes Üüberlegen, wann der Fall eintritt, sagt mir, dass man dann den Thread während des Betriebes von außen abschießen muss. Böse Sache, dass. |
AW: Überschreiben von TThread.Terminate
Zitat:
Wenn man "von Außen" eine TThread Variable hat, und diese dann aber mit einem TmeinThread belegt und .terminate aufruft, wird trotzdem nur TThread.Terminate aufgerufen. |
AW: Überschreiben von TThread.Terminate
Andere Frage: wieso kann ich in TThread.Terminate auf der (einzigen) Zeile
Delphi-Quellcode:
keinen Breakpoint setzen, der auch angesteuert wird?
FTerminated := True;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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