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;