Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Synchronize im HTTPThread - wie? Datenaustausch? (https://www.delphipraxis.net/200067-synchronize-im-httpthread-wie-datenaustausch.html)

Markus Effenberger 15. Mär 2019 21:04

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;

Schokohase 15. Mär 2019 21:11

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:
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;
sorgt auch für eine serielle Ausführung

Markus Effenberger 15. Mär 2019 21:36

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 15:59 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