Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: THREADS: Benutzung von "TThread.ReturnValue"

  Alt 5. Nov 2003, 10:23
Hi Leute,

ich habe das Problem jetzt folgender Massen gelöst :

Erstmal habe ich mir eine seperate Klasse ThreadResult erstellt(s. Code) :

Code:
unit ThreadResult;

interface

uses Classes;

type

   TThreadResult = class
      private
         fStr : String;
         fInt : Longint;
         fOk : Boolean;
      protected
         {}
      public
         Constructor Create;
         property StrRes : String read fStr write fStr;
         property IntRes : Longint read fInt write fInt;
         property Ok    : Boolean read fOk write fOk;
   end;

implementation

constructor TThreadResult.Create;
begin
   inherited;
   fStr := '';
   fInt := -100;
   fOk := false;
end;

end.
So, vorm starten eines Threads erzeuge ich eine Instanz dieser Klasse und übergebe diese mit in den Thread.
Da die Instanz dieser Klasse nicht vom Thread erzeugt wird, wird der Speicherbereich auch nicht nach Ende des Threads freigegeben.
An den Thread wird ja nur ein Zeiger auf die Klasse übergeben, so kann der Thread die Werte der Klase ändern, aber die Klase wird nicht bei Beendigung des Threads zerstört.
Siehe folgendes Beispiel :

Code:
function ThreadBsp : Boolean;
Var
   myThd  : TmyThread;
   ThdRes : TThreadResult;
begin
   // Speicher-KLasse für THread-ERgebnis erzeugen
   ThdRes := TThreadResult.Create;
   try
      // Thread erzeugen, wird aber noch nicht gestartet
      myThd := TmyThread.Create(ThdRes);
      // Thread starten
      myThd.Resume;
      // auf Ende des Threads warten
      myThd.WaitFor;
      // Thread-Ergebnis auslesen
      result := ThdRes.Ok;

      // Wenn man einen String als Rückgabewert erwartet dann ..
      // ThdRes.StrRes

      // Wenn man einen Integer als Rückgabe Wert erwartet dann ..
      // ThdRes.IntRes
   finally
      // Speicher-KLasse wieder freigeben
      ThdRes.free;
   end;
end;
Der Thread selber wird suspended gestart und die Eigenschaft FreeOnTerminate wird auf True gesetzt !

Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat