AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überschreiben von TThread.Terminate

Ein Thema von MatthiasR · begonnen am 7. Jul 2010 · letzter Beitrag vom 7. Jul 2010
Antwort Antwort
Seite 1 von 3  1 23      
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:31
Delphi-Version: 2005
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:
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.
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?

Danke für die Aufklärung
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:36
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:37
// override hier ja nicht nötig, da nicht virtual Genau falsch ... es muß heißen
"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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:45
// override hier ja nicht nötig, da nicht virtual Genau falsch ... es muß heißen
"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).
Ganz richtig wäre: TThread ruft Terminate nie auf, deswegen muss es auch nicht virtual sein. Ein simples verdecken (reintroduce) reicht hier völlig aus.

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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:49
Ganz richtig wäre: TThread ruft Terminate nie auf, deswegen muss es auch nicht virtual sein. Ein simples verdecken (reintroduce) reicht hier völlig aus.
Schonmal in den Destructor von TThread geguckt?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#6

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:49
// override hier ja nicht nötig, da nicht virtual Genau falsch ... es muß heißen
"override hier ja nicht möglich, da nicht virtual"
Ob du's glaubst oder nicht, ich habe relativ lange überlegt, ob ich "nötig" oder "möglich" schreiben soll, ersteres kam mir aber in meinem Zusammenhang sinnvoller vor.
Heißt also, du kannst es nicht überschreiben
Und TThread ruft nur das ihm bekannte Terminate auf (deines kennt er nicht).
Heißt also, ich habe keine Möglichkeit, innerhalb von TMeinThread.Terminate das TThread.Terminate aufzurufen? Ist das allgemein bei jeder nicht-virtuellen Methode so, wenn man in einer abgeleiteten Klasse eine Methode genauso benennt? Ab da kennt die abgeleitete Klasse die geerbte Methode gleichen Namens nicht mehr?
Wie wäre es mit einem Eventhandler für OnTerminate?
Jo, das wäre eine der Alternativen, die mir im Kopf rumschwebt . Wobei ich dann ja nicht verhindern kann, dass jemand, der meine neue TMeinThread-Klasse verwendet, dem OnTerminate-Ereignis einen anderen Handler zuordnet und meiner dadurch abgehängt wird?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:53
Wenn nich virtuell dann gibt es auch keine VMT
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:07
Ganz richtig wäre: TThread ruft Terminate nie auf, deswegen muss es auch nicht virtual sein. Ein simples verdecken (reintroduce) reicht hier völlig aus.
Schonmal in den Destructor von TThread geguckt?
Ui, korrekterweise wäre dann ein Virtual sinnvoll, weil man sich sonst nirgendwo ins Terminate reinklinken kann.
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:09
Ganz richtig wäre: TThread ruft Terminate nie auf, deswegen muss es auch nicht virtual sein. Ein simples verdecken (reintroduce) reicht hier völlig aus.

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.
Wette ich um ein virtuelles Bier dagegen

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.
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#10

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:14
Andere Frage: wieso kann ich in TThread.Terminate auf der (einzigen) Zeile
FTerminated := True; keinen Breakpoint setzen, der auch angesteuert wird?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:06 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