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 THREADS: Benutzung von "TThread.ReturnValue" (https://www.delphipraxis.net/3948-threads-benutzung-von-tthread-returnvalue.html)

APP 8. Apr 2003 10:11


THREADS: Benutzung von "TThread.ReturnValue"
 
Hallo,

ich suche ein Beispiel für die Benutzung von "TThread.ReturnValue",
darf man lt. Hilfe dieses Property frei benutzen :?:

Zitat:

Specifies the value returned to other waiting threads when the thread finishes executing.

Delphi syntax:

property ReturnValue: Integer
...
Description

Use ReturnValue to indicate success/failure or numeric result/output of the thread to the application or other threads. The WaitFor method returns the value stored in ReturnValue.

DataCool 5. Aug 2003 10:15

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
Genau an diesem Problem sitze ich auch gerade !
Laur Delphi-Hilfe soll die Methode waitfor, auf das ende eines Threads warten und den Wert von ReturnValue zurück geben, eigentlich genau was ich brauche.

Aber es funktioniert leider nicht !
Wann muß der Wert für ReturnValue innerhalb des Threads gesetzt werden ?
Ich mache das im Moment im Ereigniss OnTerminate, hab's aber auch schon am Ende von Execute gemacht; beides kein Erfolg !

Im Moment mache das ganze quick and dirty !
Habe mir ne global zugängliche Longint Variable in der Threadunit erstellt, schreibe da das Ergebnis rein und lese es vom Hauptthread nachdem ich waitfor des threads aufgerufen habe wieder aus.
Aber das kann's doch nicht sein, oder ?

Praktikant 5. Nov 2003 10:05

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
und ich suche auch ein Bsp. wie man returnvalue und wait for benutzt.
Die Delphi Hilfe bietet da ja überhaupt nichts.

Hmm... sehe dass das ja nur mit Verbindung von threads geht. Da ich davon null plan habe brauche ich nun doch nicht mehr wissen wie return/waitfor funktioniert. :roll:

DataCool 5. Nov 2003 10:23

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
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

scp 5. Nov 2003 10:41

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
Ein Beispiel:

Delphi-Quellcode:
procedure TDownloadThread.Execute;
begin
  ReturnValue := 0;

  DownloadFiles;

  ReturnValue := 1;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadResult : integer;
begin
  ThreadResult := DownloadThread.WaitFor;

  If (ThreadResult = 1) then
    ShowMessage('Thread beendet')
  else
  If (ThreadResult = 0) then
  else
    ShowMessage('Thread läuft noch')
  else
  If (ThreadResult < 0) then
    ShowMessage('Thread mit Fehler ' + IntToStr(ThreadResult) + ' beendet.');
end;

Luckie 5. Nov 2003 10:48

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
Dann darf FreeOnTerminate natürlich nicht True sein. Oder täusche ich mich da jetzt? :gruebel:

scp 5. Nov 2003 10:51

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
Stimmt, sonst wäre waitfor ja nicht mehr gültig.

DataCool 5. Nov 2003 10:51

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
@Luckie:
Du meintest doch nicht mich oder ?

@SCP:
Mir und den anderen ging es nicht darum herrauszufinden, ob der Threads noch läuft, sondern je nach Ablauf des Threads ein bestimmtes Ergebnis zu erhalten

Gruß Data

scp 5. Nov 2003 10:57

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
siehe oben

Luckie 5. Nov 2003 10:59

Re: THREADS: Benutzung von "TThread.ReturnValue"
 
@DataCoo, ich meinte spc.

@spc: Jetzt wird es aber kompliziert: Wo wird der negative ExitCode gesetzt?


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