Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread.Terminated erzeugt unbekannter Bezeichner (https://www.delphipraxis.net/83798-thread-terminated-erzeugt-unbekannter-bezeichner.html)

ozz 6. Jan 2007 16:42


Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo Leute,
ich stolpere über das Problem, das bei mir die Eigenschaft Terminated für Threads fehlt. :idea: In der Doku ist es vorhanden ,jedoch beim complilieren bekomme ich einen Fehler (unbekannter Bezeichner). Die Eigenschaft Suspended gibt es und die funktioniert auch. Woran könnte dies liegen?
Witzigerweise ist die Property in Classes.pas enthalten. :gruebel:

jbg 6. Jan 2007 17:06

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Zitat:

Zitat von ozz
Witzigerweise ist die Property in Classes.pas enthalten. :gruebel:

Gegenfrage: Was bedeutet die Sichtbarkeit private, protected und public/published?
Wenn du diese Frage beantworten kannst, dann sollte sich dein Problem erklären.

Sunlight7 6. Jan 2007 17:12

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo!

Du versuchst nicht zufällig .Terminated außerhalb Deiner abgeleiteten Komponente TThread zu verwenden?

Grüßle!

ozz 6. Jan 2007 17:36

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo Sunlight7,
ja genau. Ich habe das Problem mit dem Protected jetzt auch geblickt. Wie kann ich trotzdem prüfen, ob ein Thread bereits beendet ist?

jbg 6. Jan 2007 17:53

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Die einfachste Version ist, einfach bei deiner Thread-Klasse unter public ein "property Terminated;" schreiben. Aber Vorsicht: "Terminated" wird nicht gesetzt wenn du nicht persönlich die Terminate-Methode des Threads aufgerufen hast. Du müsstest also in einen try/finally Block in der Execute-Methode im finally auch Terminate aufrufen.

Sunlight7 6. Jan 2007 19:34

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Ich würde dafür eher das Ereignis Hier im Forum suchenOnTerminate empfehlen, damit kollidierst Du dann auch nicht wenn Hier im Forum suchenFreeOnTerminate True ist.

ozz 6. Jan 2007 19:54

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo Sunlight7,
danke für den Hinweis mit dem OnTerminate. Ich schau es mir nochmal genau an. Im Prinzip benötige ich es jedoch nicht, da ich FreeOnTerminate:=false verwende.


Hallo jbg,
danke für den Hinweis mit dem Finally. Hatte ich natürlich glatt vergessen. :lol:

Sunlight7 6. Jan 2007 20:10

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Da Du damit scheinbar erste Schritte machst, hast Du TThread in eine neue Klasse abgeleitet?

ozz 6. Jan 2007 21:30

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo Sunlight7,
ja, ich habe eine Klasse davon abgeleitet.Gib es noch etwas zu beachten?

Delphi-Quellcode:
unit HttpGetThreads;

interface

uses
  Classes,
  IdBaseComponent, IdComponent,IdTCPConnection,IdTCPClient, IdHTTP,IdObjs;//Indy
type
  TMyHttpThreads = class(TThread)

  private
  IdHTTP: TIdHTTP;
  ContentStream:TStringStream;
  FURL:string;
  FTerminated:Boolean;
  procedure loadComplete;

  public
    property ActualURL: String read FURL;
    property Terminated:Boolean read FTerminated;
  protected
    procedure Execute; override;
  end;

implementation
uses JobQueueMultiThread;//Main

procedure TMyHttpThreads.Execute;
var loop:Integer;
begin
 try
 FTerminated:=False;
 IdHTTP:=TIdHTTP.Create;

  while ((JobQueue.Joblist.Count>0) and Terminated=false) do
  begin;
   FURL:=JobQueue.Joblist.Strings[0];
   JobQueue.Joblist.Delete(0);

   ContentStream:= TStringStream.Create(toEOF);
   try
   IdHTTP.Get(FURL,ContentStream);
   except
    on e:EIdHTTPProtocolException do
        begin
          JobQueue.Joblist.Add(FURL);
        end;
   end;

   ContentStream.Seek(0, soFromBeginning);
   Synchronize(loadComplete);

   ContentStream.Destroy;
  end;
 finally
  FTerminated:=True;
  IdHTTP.Destroy;
  if Assigned (ContentStream) then ContentStream.Destroy;
 end;
end;

procedure TMyHttpThreads.loadComplete;
begin
 JobQueue.ThreadResult(ContentStream);
end;

end.

Sunlight7 6. Jan 2007 22:14

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Aua:

Delphi-Quellcode:
while ((JobQueue.Joblist.Count>0) and Terminated=false) do begin;
=
Delphi-Quellcode:
while ((JobQueue.Joblist.Count>0) and not Terminated) do begin
Einmal ohne "=false" und einmal ohne ";" :wink:

Wenn in dem try finally Block eine Exception auftritt, wird Dein Programm mit ner Fehlermeldung beendet. :wink:
Falls das nicht gewollt is, dann auf try except umarbeiten.

Sonst seh ich auf den 1. Blick nix falsches.

Edit: Auf den 2. doch noch was, verwende .Free anstatt .Destroy oder noch besser, wenns Dein Delphi kennt, FreeAndNil!

ozz 7. Jan 2007 09:20

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo Sunlight7,
danke für das Aua. :idea:
1. Im Prinzip verstehe ich das mit dem not und false. Nur warum ist dies besser?
2. Warum ist das Semikolon denn falsch? Delphi mäckert nicht. :gruebel:
3. Ich warum ist Free besser als Destroy. Free gibt den Speicher frei, destory die Ganze Instanz (dachte ich). :drunken:

dominikkv 7. Jan 2007 09:45

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Zitat:

Zitat von ozz
3. Ich warum ist Free besser als Destroy. Free gibt den Speicher frei, destory die Ganze Instanz (dachte ich). :drunken:

Free und Destroy geben beide den Speicher frei...nur Free überprüft zuerst ob das Objekt überhaupt noch existiert und gibt es selbständig mit Destroy frei.
Um Laufzeitfehler vorzubeugen würde ich Free verwenden.

marabu 7. Jan 2007 09:49

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo,

Zitat:

Zitat von ozz
1. Im Prinzip verstehe ich das mit dem not und false. Nur warum ist dies besser?

Es ist eine Frage von Stil und Effizienz: Wer den Ausdruck "Terminated = False" auswerten lässt, der kann auch auf jedes Rechenergebnis null aufaddieren. "Terminated" ist bereits ein einfacher logischer Ausdruck, der zusätzliche Vergleich verändert das Ergebnis nicht.

Zitat:

Zitat von ozz
2. Warum ist das Semikolon denn falsch? Delphi mäckert nicht.

Das Semikolon trennt in Delphi Anweisungen: "begin;FURL := SomeUrl" ist äquivalent zu "begin {Leeranweisung};FURL := SomeUrl". Das Semikolon schadet also an dieser Stelle nicht, sieht aber etwas bucklig aus.

Zitat:

Zitat von ozz
3. Ich warum ist Free besser als Destroy. Free gibt den Speicher frei, destory die Ganze Instanz (dachte ich).

Free() prüft vor dem internen Aufruf des Destruktors, ob überhaupt eine gültige Instanz vorliegt. Du kannst also Free immer straflos aufrufen, auch wenn das Objekt vorher gar nicht instanziert wurde.

Grüße vom marabu

ozz 7. Jan 2007 10:52

Re: Thread.Terminated erzeugt unbekannter Bezeichner
 
Hallo marabu, Hallo dominikkv.
herzlichen Dank für die Erläuterungen. Wieder was gelernt. :dancer2:


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