![]() |
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:
|
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 ? |
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: |
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:
So, vorm starten eines Threads erzeuge ich eine Instanz dieser Klasse und übergebe diese mit in den Thread.
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. 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:
Der Thread selber wird suspended gestart und die Eigenschaft FreeOnTerminate wird auf True gesetzt !
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; Gruß Data |
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; |
Re: THREADS: Benutzung von "TThread.ReturnValue"
Dann darf FreeOnTerminate natürlich nicht True sein. Oder täusche ich mich da jetzt? :gruebel:
|
Re: THREADS: Benutzung von "TThread.ReturnValue"
Stimmt, sonst wäre waitfor ja nicht mehr gültig.
|
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 |
Re: THREADS: Benutzung von "TThread.ReturnValue"
siehe oben
|
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 02:39 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