![]() |
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:
Vielen Dank für die Umgehung meine Gehirnbremse :cyclops: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; Stevie |
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 |
AW: Aus Indy 10 Webserver einen Thread starten ???
Zitat:
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: |
AW: Aus Indy 10 Webserver einen Thread starten ???
.. wenn Du hier:
Delphi-Quellcode:
Deinen Thread startest musst Du irgendwie darauf warten bis er beendet ist
try
Access := _Json(s); meinThread; except end; um Deine verarbeiteten Daten der responseInfo zu übergeben.
Delphi-Quellcode:
Also, warum dann einen Thread verwenden.
AResponseInfo.ContentType := 'applicaton/json';
AResponseInfo.ResponseNo := iResponse; AResponseInfo.CharSet := 'utf-8'; AResponseInfo.ContentEncoding := 'utf-8'; AResponseInfo.ContentText := (meinThread_Antwort); Wenn Dir der Code die onCommandget Routine zu groß aufbläst, lagere ihn in eine Methode aus. Grüße Klaus |
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. |
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 18:22 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