AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Überschreiben von TThread.Terminate

Ein Thema von MatthiasR · begonnen am 7. Jul 2010 · letzter Beitrag vom 7. Jul 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu
Online

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 07: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?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 07: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.055 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 07: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
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: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
 
#5

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08: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
 
#6

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08: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
Benutzerbild von sirius
sirius

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 08:32
@jfheins: Mist, naja virtuelle Biere sind ja recht günstig.
Aber dann hat TThread echt einen Designfehler (also noch einen mehr). Denn wo kann ich sonst zum Terminate noch etwas anfügen? Ich benutze diese Methode (hatte mich anfangs auch gewundert warum nicht virtuell, und mir dann meine, diese, Erklärung zurechtgelegt) recht häufg, wenn zum Beispiel mein Thread schläft auf Grund von:
  • waitforsingleobject (o.ä)
  • Winsock.recv
  • ReadFile (bei Pipe)
  • Warten auf Datenbank-Event
  • ...
Wie macht man das dann?

@MatthiasR
Menu - Projektoptionen -> Debug-DCUs verwenden
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:10
Die Prozedur Terminate setzt nur .Terminated auf true.
Ob und wie der Thread das nun intern beachtet ist egal.

Terminate/Terminated beendet die Threadverarbeitung nicht.
Terminated sagt nur "Hallo lieber Thread, würdest du dich bitte mal beenden?"

Also eigentlich sehe ich demnach auch keinen Grund, warum dieses überschreibar sein soll, da man es ja Threadintern dennoch anders behandeln kann (z.B. einfach ignorieren oder mit was Anderem verknüpfen).

Es muß ja nicht sein, daß man alles virtuell macht und so die VMT unnütz vergrößert.



- bei WaitForSingleObject und Co. läßt sich auch noch eine weitere Abbruchbedingung einbauen.
- ReadFile ließe sich Asynchron verarbeiten
- usw.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Jul 2010 um 09:13 Uhr)
  Mit Zitat antworten Zitat
MatthiasR

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:21
@MatthiasR
Menu - Projektoptionen -> Debug-DCUs verwenden
Bei mir unter D7 wäre das dann: Projekt -> Optionen -> Compiler -> Mit Debug-DCUs. Nur bringt das bei mir irgendwie nichts. Der Breakpoint innerhalb TThread.Terminate ist immernoch durchgestrichen und die Zeile grün, statt rot.

Also eigentlich sehe ich demnach auch keinen Grund, warum dieses überschreibar sein soll, da man es ja Threadintern dennoch anders behandeln kann (z.B. einfach ignorieren oder mit was Anderem verknüpfen).
Innerhalb meines TMeinThread.Execute wird ein mitunter sehr lange dauernder Download getätigt, der beim Aufruf von Terminate abgebrochen werden soll, damit überhaupt die Chance besteht, das Terminated-Flag auszuwerten und den Thread zu beenden. Das liebste wäre mir gewesen, wenn ein Aufruf von Terminate von außen ausreicht und das Unterbrechen des Downloads intern automatisch durchgeführt wird. Aber ich kann aus dem einen Terminate-Aufruf auch zwei Aufrufe machen. Terminate und anschließend eine zweite Methode "BrecheLaufendeDownloadsAb" oder so ähnlich.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:38
Die Prozedur Terminate setzt nur .Terminated auf true.
Ob und wie der Thread das nun intern beachtet ist egal.

Terminate/Terminated beendet die Threadverarbeitung nicht.
Terminated sagt nur "Hallo lieber Thread, würdest du dich bitte mal beenden?"

Also eigentlich sehe ich demnach auch keinen Grund, warum dieses überschreibar sein soll, da man es ja Threadintern dennoch anders behandeln kann (z.B. einfach ignorieren oder mit was Anderem verknüpfen).
Wie "gut", dass FTerminated private und die property Terminated, die gottseidank protected ist nur read only ist. /irony=off

Zum Glück hat ein Thread ein OnTerminate Event, wie schade nur, dass das erst aufgerufen wird, nachdem der Thread terminated wurde, und nicht zu dem Zeitpunkt, wo Terminate aufgerufen wurde.

Wie man es auch dreht und wendet, es ist schlecht, dass Terminate nicht virtual ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:44 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