Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Aus Indy 10 Webserver einen Thread starten ??? (https://www.delphipraxis.net/214209-aus-indy-10-webserver-einen-thread-starten.html)

Supergr 4. Dez 2023 15:33

Aus Indy 10 Webserver einen Thread starten ???
 
Hallo Zusammen,

ich versuche mich gerade an einem kleinen Webserver für eine Datenbankabfrage. Da der Webserver "Multitasking" fähig ist muss ich die Datenbankabfrage in einem Thread verbuchen.

Jetzt finde ich nicht wirklich sinnvolle Infos wie ich das genau anstellen muss...
Die Anfragen kommen als body im JSon Format rein und sollen auch als JSON in der ResponseInfo wieder raus.

in der IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); kommen ja vom Server alle Daten an.

Wie bekomme ich die Sinnvoll in meinen Thread übergeben und vor allem die AResponseInfo wieder zurück?
ist denn wenigstens die CommandGet Routine (mit CreatePostStream & DoneWithPostStream) Threadsave ??

hier die einfache CommandGet Routine. Also wie übergebe ich die Daten an den Thread und wie bekomm ich die passende Antwort für den dazugehörigen IDContext?
Hat das schon mal jemand erfolgreich 8-) erledigt... ?

Code:
 

procedure TAct2DDM.IdHTTPServer1CommandGet(AContext: TIdContext;  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
   Stream : TStream;
   sr : TStreamReader;
begin
  If ARequestInfo.CommandType = hcPOST then
  begin
   
    Stream := ARequestInfo.PostStream;
    SR := TStreamReader.Create(Stream);
    if Assigned(Stream) then
    begin
    try
        while not SR.EndOfStream do
        begin
          s:= s + SR.ReadLine;
        end;
     SR.Free;
     finally
    end;
    end;

    try
      Access := _Json(s);
      meinThread;
    except
    end;

  AResponseInfo.ContentType := 'applicaton/json';
  AResponseInfo.ResponseNo := iResponse;
  AResponseInfo.CharSet    := 'utf-8';
  AResponseInfo.ContentEncoding := 'utf-8';
  AResponseInfo.ContentText := (meinThread_Antwort);
end;
Vielen Dank für die Umgehung meine Gehirnbremse :cyclops:
Stevie

Klaus01 4. Dez 2023 15:44

AW: Aus Indy 10 Webserver einen Thread starten ???
 
.. läuft denn die ganze Abarbeitung des Webrequest nicht eh schon in einem Thread.
OnCommandGet ist doch meines Wissens nicht blockierend.

Grüße
Klaus

Supergr 4. Dez 2023 16:01

AW: Aus Indy 10 Webserver einen Thread starten ???
 
Zitat:

Zitat von Klaus01 (Beitrag 1530400)
.. läuft denn die ganze Abarbeitung des Webrequest nicht eh schon in einem Thread.
OnCommandGet ist doch meines Wissens nicht blockierend.

Grüße
Klaus

Klar, aber das die Abfrage doch recht umfangreich ist würde ich das gerne als Thread machen... Die Routine würde sonst den Editor sprengen :lol:
Das hieße ja dass alles an Code in die eine Schleife muss... Was ja theoretisch gehen würde. :wink:

Und es macht ja Sinn es als eigenen Thread laufen zu lassen. Pro Abfrage auf großen DB's braucht die schon mal bis zu 500ms und wenn 4 oder 5 pro Sekunde reinkommen reicht das nicht es nacheinander zu machen.

Btw. interessiert mich die Lösung wie ich das übergebe und zurück bekomme...:idea:

Klaus01 4. Dez 2023 20:36

AW: Aus Indy 10 Webserver einen Thread starten ???
 
.. wenn Du hier:

Delphi-Quellcode:
    try
      Access := _Json(s);
      meinThread;
    except
    end;
Deinen Thread startest musst Du irgendwie darauf warten bis er beendet ist
um Deine verarbeiteten Daten der responseInfo zu übergeben.
Delphi-Quellcode:
  AResponseInfo.ContentType := 'applicaton/json';
  AResponseInfo.ResponseNo := iResponse;
  AResponseInfo.CharSet   := 'utf-8';
  AResponseInfo.ContentEncoding := 'utf-8';
  AResponseInfo.ContentText := (meinThread_Antwort);
Also, warum dann einen Thread verwenden.
Wenn Dir der Code die onCommandget Routine zu groß aufbläst, lagere ihn in eine Methode aus.

Grüße
Klaus

Olli73 5. Dez 2023 15:28

AW: Aus Indy 10 Webserver einen Thread starten ???
 
Wie bereits erwähnt wurde, erzeugt der HTTP-Server schon Threads. Ein weiterer Thread ist also nicht nötig.

Du musst lediglich darauf achten, dass jeder Thread seine eigene Connection (und natürlich eigene Queries) hat.

Am einfachsten und strukturiertesten geht das, wenn du dir ein Webbroker-Projekt erstellst und dort dann im "WebModul" deine Pfade definierst und ausprogrammierst. Je Thread kriegst du auch ein Webmodul automatisch erzeugt, du kannst dein Connection und Queries auch drauf legen... Du darfst nur keine globalen Variablen verwenden und Felder/Properties sind nur für die eine Abfrage zu verwenden, da die nächste Abfrage in einem anderen Thread/Webmodul-Instanz landen kann.

Supergr 6. Dez 2023 16:33

AW: Aus Indy 10 Webserver einen Thread starten ???
 
Hallo Zusammen,

danke Euch. Habe durch die Anregungen eine Lösung gefunden! :thumb:

Grüße Stevie


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.

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