![]() |
Synchronize im HTTPThread - wie? Datenaustausch?
Hallo miteinander,
Kann mir jemand verraten oder vielleicht ein Codebeispiel nennen, wie man in der Prozedur "HTTPServerCommandGet" (Indy) ein Synchronize aufruft und die Prozedur ANTWORTEN_ERZEUGEN außerhalb des Threads ausführen kann? Das Problem ist, dass ich Objekte aus dem GUI bzw FMX verwende und das scheinbar im Get-Thread nicht funktioniert. Wenn ich das richtig verstehe, muss man (A) die Variablen AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo in den Hauptthread kopieren (wie macht man das?) Dann muss man (B) per Timer oder sowas im Hauptthread die Erzeugung der Antwort ausführen. (C) Den Antwortstring in den Thread zurückkopieren und im Thread so lange "warten" und dann den Antwortstring versenden. Habe mir schon diverse Threadbeispiele angeschaut, aber ich befürchte ich sehe gerade den berühmten Wald vor Bäumen nicht. Markus Bisher:
Code:
type
TfrmMain = class(TForm) MenuItemProgramm: TMenuItem; MenuItemClose: TMenuItem; MenuBar1: TMenuBar; ... private { Private-Deklarationen } CriticalSection_HTTP_Get_Thread: TCriticalSection; public { Public-Deklarationen } end; procedure TfrmMain.HTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); procedure ANTWORTEN_ERZEUGEN; VAr Dateiname, Antwort : string; begin ... if ARequestInfo.Params.Values['GetUnternehmensdaten'] <> '' then begin AResponseInfo.ContentText := komplette_Tabelle_als_String('Unternehmensdaten'); end; end; begin CriticalSection_HTTP_Get_Thread.Enter; try Global_BeginUpdate; // Alle Elemente des GUI BeginUpdate ausführen ANTWORTEN_ERZEUGEN; // -> AResponseInfo.ContentText except on e:exception do begin AResponseInfo.ContentText := 'Systemfehlermeldung vom Server: ' + e.Message; end; end; CriticalSection_HTTP_Get_Thread.Leave; Global_EndUpdate; // Alle Elemente des GUI BeginUpdate ausführen end; |
AW: Synchronize im HTTPThread - wie? Datenaustausch?
WAS für Objekte benutzt du aus der GUI verwendest du?
Das mit der Queue und dem Timer kannst du erstmal vergessen. Ein beherztes
Delphi-Quellcode:
sorgt auch für eine serielle Ausführung
procedure TfrmMain.HTTPServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin // Im Get Thread ... TThread.Synchronize( nil, procedure begin // ab hier darfst du mit der UI spielen ... end ); // ab hier nicht mehr, denn du bist wieder // Im Get Thread ... end; |
AW: Synchronize im HTTPThread - wie? Datenaustausch?
danke du bist meine Rettung :)
Funktioniert bis jetzt Manchmal kann es so einfach sein ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz