Einzelnen Beitrag anzeigen

Markus Effenberger

Registriert seit: 2. Jul 2014
44 Beiträge
 
Delphi 10.3 Rio
 
#1

Synchronize im HTTPThread - wie? Datenaustausch?

  Alt 15. Mär 2019, 21:04
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;
  Mit Zitat antworten Zitat