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.