AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronize im HTTPThread - wie? Datenaustausch?

Ein Thema von Markus Effenberger · begonnen am 15. Mär 2019 · letzter Beitrag vom 15. Mär 2019
Antwort Antwort
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, 22: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
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: Synchronize im HTTPThread - wie? Datenaustausch?

  Alt 15. Mär 2019, 22:11
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
  Mit Zitat antworten Zitat
Markus Effenberger

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

AW: Synchronize im HTTPThread - wie? Datenaustausch?

  Alt 15. Mär 2019, 22:36
danke du bist meine Rettung

Funktioniert bis jetzt

Manchmal kann es so einfach sein

Geändert von Markus Effenberger (15. Mär 2019 um 22:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 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