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
MatthiasR

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

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 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, 09:46
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.
HAst du das Projekt auch neu erzeugt oder nur gestartet (letzteres reicht nicht immer aus)?

Zitat:
Aber ich kann aus dem einen Terminate-Aufruf auch zwei Aufrufe machen. Terminate und anschließend eine zweite Methode "BrecheLaufendeDownloadsAb" oder so ähnlich.
Du kannst auch einfach Terminate verdecken (also ohne override), wenn du (wie ich jetzt begriffen habe) DeineKlasse.Terminate direkt von außen aufrufst. Und wenn du eh eine spezielle Methode einbauen musst, ist das ja auch gegeben.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 09:55
Du kannst auch einfach Terminate verdecken (also ohne override), wenn du (wie ich jetzt begriffen habe) DeineKlasse.Terminate direkt von außen aufrufst.
Aber nicht vergessen daß die Thread-Variable dann auch mit TMeinThread deklariert sein muß.
Bei einer TThread-Variable würde wieder das "Alte" aufgerufen.

Dann eben in die DMT.


Pipes gehen nicht asynchron (zumindest bis XP)
Kann mich nicht erinnern mal was davon irgendwo gelesen zu haben, daß es irgendwo nicht geht, aber hab mich auch noch nicht so mit Pipes beschäftigt und dieses bisher nur für "normale" Dateien verwendet.


Wie, womit wird denn die Datei runtergeladen?
Viele der Wege bieten es ja an, daß man wärend des Downloads Ereignisse bekommt oder wo man stückchenweise in einen Puffer lesen kann und dann dazwischen die Abbuchbedingung mit einbindet.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MatthiasR

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 10:08
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.
HAst du das Projekt auch neu erzeugt oder nur gestartet (letzteres reicht nicht immer aus)?
Ja, ich habe das Projekt komplett neu erzeugt, nicht nur compiliert!
Zitat:
Aber ich kann aus dem einen Terminate-Aufruf auch zwei Aufrufe machen. Terminate und anschließend eine zweite Methode "BrecheLaufendeDownloadsAb" oder so ähnlich.
Du kannst auch einfach Terminate verdecken (also ohne override), wenn du (wie ich jetzt begriffen habe) DeineKlasse.Terminate direkt von außen aufrufst. Und wenn du eh eine spezielle Methode einbauen musst, ist das ja auch gegeben.
Eben das ist doch das hüpfende Komma. Ich habe Terminate anfangs einfach nur verdeckt, sprich in meiner eigenen Thread-Klasse nochmals deklariert. Nur: wie kann ich dann in "meinem" Terminate zu Beginn noch das geerbte Terminated-Flag auf True setzen? TThread.Terminate kenn meine Klasse nicht mehr. Auf das Feld FTerminated hat es keinen Zugriff und die property Terminated ist nur lesbar . IMO darf Terminate also überhaupt nicht verdeckt werden, weil man sonst von außen überhaupt keine Möglichkeit mehr hat, das Terminated-Flag zu setzen. Was wieder zu der These führt, die Methode Terminate hätte als virtual deklariert werden müssen.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 10:16
Du kannst nach wie vor die Vorgängermethode aufrufen. Mach ich ja, wie gesagt, auch ständig.

Du kannst dir ja mal bspw. mein DosCommand ansehen:
http://forum.delphi-treff.de/showthr...783#post201783
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.

Geändert von sirius ( 7. Jul 2010 um 10:19 Uhr)
  Mit Zitat antworten Zitat
MatthiasR

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 10:17
Und wie geht das? Mit inherited?
  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, 10:25
Und wie geht das? Mit inherited?
ja, ein Beispiel aus obiger verlinkter Unit:
Delphi-Quellcode:
constructor TReadPipe.Create(Aread_stdout,Awrite_stdout:THandle);
begin
  inherited Create(false);
  FEvent:=TEvent.Create(nil,false,false,'');
  FSyncString:=TSyncString.Create;
  Fread_stdout:=Aread_stdout;
  Fwrite_stdout:=Awrite_stdout;
  freeonterminate:=true;
end;

destructor TReadPipe.Destroy;
begin
  FEvent.Free;
  FSyncString.Free;
  inherited;
end;

procedure TReadPipe.Execute;
var Buf:array[0..1023] of byte;
    bread:Cardinal;
    s:string;
begin
  repeat
    ReadFile(Fread_stdout, Buf, length(buf), bread, nil); //wait for input
    if terminated then exit;
    setlength(s,bread);
    move(buf[0],s[1],bread);
    FSyncstring.Add(s);
    FEvent.SetEvent;
  until terminated;
end;

procedure TReadPipe.Terminate;
const fin='fin';
var bwrite:Cardinal;
begin
  inherited;
  WriteFile(Fwrite_stdout,fin,length(fin),bwrite,nil);
end;
Es gibt da auch noch ein größeres Beispiel.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
MatthiasR

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 10:36
Der Breakpoint innerhalb TThread.Terminate ist immernoch durchgestrichen und die Zeile grün, statt rot.
dieses Terminate wird auch verwendet?
Was nicht einkompiliert ist (weil es z.B. nicht verwendet wird), das kann auch nicht im Debugger mit einem Haltepunkt versehn werden.

Sind denn in dieser Procedur die kleinen blauen Pünktchen zu sehn?
(oder überhaupt irgendwo in der ganzen Unit)
Ja natürlich wird das TThread.Terminate ebenfalls verwendet, wie soll ich sonst die property Terminated setzen?

Und nein, in der ganzen Classes-Unit werden keine blauen Pünktchen angezeigt, auch wenn die Debug-DCUs aktiviert sind.

Und wie geht das? Mit inherited?
ja, ein Beispiel aus obiger verlinkter Unit
OK, hätte mich auch schwer gewundert, weil ich ja auch schon zigmal einen constructor Create (ebenfalls nicht virtual deklariert) auf diese Weise verdeckt habe und intern über inherited trotzdem aufrufen konnte. Dann klappte das in meinem Code-Schnipsel aus Beitrag 1 die ganze Zeit, nur hat es mich irritiert (und es irritiert mich weiterhin), dass ich in TThread.Terminate keinen Breakpoint setzen kann. Dann ist das also mein eigentliches Problem, trotz der nun aktivierten Debug-DCUs.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Überschreiben von TThread.Terminate

  Alt 7. Jul 2010, 10:23
Der Breakpoint innerhalb TThread.Terminate ist immernoch durchgestrichen und die Zeile grün, statt rot.
dieses Terminate wird auch verwendet?
Was nicht einkompiliert ist (weil es z.B. nicht verwendet wird), das kann auch nicht im Debugger mit einem Haltepunkt versehn werden.

Sind denn in dieser Procedur die kleinen blauen Pünktchen zu sehn?
(oder überhaupt irgendwo in der ganzen Unit)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:52 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