Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String und Longint als Rückgabewert eines Threads (https://www.delphipraxis.net/5043-string-und-longint-als-rueckgabewert-eines-threads.html)

DataCool 21. Mai 2003 15:48


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:
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;
In meiner Hauptapplikation frage ich den Thread folgendermaßen ab :
Delphi-Quellcode:
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;
Komischerweise erhalte ich den LONGINT Wert Result den richtigen Wert zurück, aber die property strResult ist immer leer.
Woran kann das liegen ?

Data

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Mario 21. Mai 2003 15:52

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.

Mario 21. Mai 2003 15:54

Nachtrag:
Schau mal hier: http://www.entwickler-forum.de/webx?13@@.ee8c881

DataCool 21. Mai 2003 16:53

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 ?

Mario 21. Mai 2003 18:58

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