AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Aus Indy 10 Webserver einen Thread starten ???
Thema durchsuchen
Ansicht
Themen-Optionen

Aus Indy 10 Webserver einen Thread starten ???

Ein Thema von Supergr · begonnen am 4. Dez 2023 · letzter Beitrag vom 6. Dez 2023
Antwort Antwort
Supergr

Registriert seit: 8. Feb 2012
12 Beiträge
 
#1

Aus Indy 10 Webserver einen Thread starten ???

  Alt 4. Dez 2023, 16:33
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 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
Stevie
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 4. Dez 2023, 16:44
.. läuft denn die ganze Abarbeitung des Webrequest nicht eh schon in einem Thread.
OnCommandGet ist doch meines Wissens nicht blockierend.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Supergr

Registriert seit: 8. Feb 2012
12 Beiträge
 
#3

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

  Alt 4. Dez 2023, 17:01
.. 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
Das hieße ja dass alles an Code in die eine Schleife muss... Was ja theoretisch gehen würde.

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...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 4. Dez 2023, 21:36
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#5

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

  Alt 5. Dez 2023, 16:28
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.
  Mit Zitat antworten Zitat
Supergr

Registriert seit: 8. Feb 2012
12 Beiträge
 
#6

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

  Alt 6. Dez 2023, 17:33
Hallo Zusammen,

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

Grüße Stevie
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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