Delphi-PRAXiS
Seite 1 von 2  1 2      

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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
Seite 1 von 2  1 2      

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