![]() |
String und Longint als Rückgabewert eines Threads
Hi Leute,
ich habe einen Thread indem ich eine Anfrage an einen Server(http-Request) schicke.
Delphi-Quellcode:
In meiner Hauptapplikation frage ich den Thread folgendermaßen ab :
procedure TInteractiveThread.DoRequest;
Var sReq : String; sReply : String; iTries : Longint; begin sReq := MakeRequestString(cActionStr[fAction],fP1,fP2,fP3); iTries := 1; Repeat LogMsg := sReq; Synchronize(LogNow); try sReply := HttpCon.Get(sReq); except sReply := ''; end; LogMsg := 'Serverantwort:"'+sReply+'"'; Synchronize(LogNow); until (CheckReply(sReply)) or (iTries > MaxRetries); sResult := sReply; iResult := getThreadResult(sReply); end; procedure TInteractiveThread.Execute; begin if not Terminated then DoRequest; // Speicher freigeben HttpCon.Disconnect; HttpCon.free; ReturnValue := iResult; end;
Delphi-Quellcode:
Komischerweise erhalte ich den LONGINT Wert Result den richtigen Wert zurück, aber die property strResult ist immer leer.
Var activeThd : TInteractiveThread;
strL : TStringList; sTmp : String; begin result := false; if Contact <> Nil then begin activeThd := TInteractiveThread.Create(cUser_Details,ID,PWD,LogF,inttostr(Contact.Nr)); try // Thread starten activeThd.Resume; // auf Ende des Threads warten activeThd.WaitFor; // Thread Ergebnis auslesen sTmp := activeThd.StrResult; if activeThd.Result = 3 then showmessage(sTmp); finally activeThd.Terminate; end; end; Woran kann das liegen ? Data [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] |
Ich könnte mir das so vorstellen:
Delphi reserviert im Thread Speicher für den String und gibt nur den Pointer darauf zurück. Beim Beenden vom Thread wird dieser Speicher wieder frei gegeben. Lösungsvorschlag: String im Haupt-Thread deklarieren und als PChar für die Rückgabe an Thread übergeben. |
|
Danke für deine Hilfe,
aber ich habe das ganze jetzt so gelöst wie man es bei Threads eigentlich auch machen sollte : Eigene Thread-Klasse geschrieben. Im Constructor des VCL-Objekt was aktualisiert werden soll übergeben. String-Information zwischengespeichert. und innerhalb des Thread syncronize(myUpdateProcedure) aufgrufen. So funktioniert es jetzt. Gruß Data P.s: Was mich aber noch interessiert : Wenn der String angeblich leer ist weil er wieder freigegeben wird, warum wird mein longint dann nicht auch freigegeben ? |
Weil der String ein Pointer auf einen Speicherbereich ist und Integer ein Wert, also kein Zeiger.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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