Wird TIdTCPServer.OnConnect vom Hauptthread aufgerufen?

Sep 08 2020

Ich weiß nicht, ob es in Ordnung ist, im TIdTCPServer.OnConnectoder OnDisconnectEreignis auf Daten aus dem Hauptthread zuzugreifen . Wird diese Methode vom Hauptthread oder einem anderen Thread aufgerufen? Ich möchte die IP in a protokollieren TMemound einige Schaltflächen aktivieren oder deaktivieren.

Antworten

3 RemyLebeau Sep 08 2020 at 22:55

TIdTCPServerist eine Multithread-Komponente. Seine OnConnect, OnDisconnect, OnExecute, und OnExceptionEreignisse werden alle im Zusammenhang mit einem Arbeitsthread gefeuert , die von der Veranstaltung vertreten TIdContextObjekt. Dieser Thread verwaltet die Client-TCP-Verbindung in der TIdContext.ConnectionEigenschaft.

Das OnListenExceptionEreignis wird im Kontext eines anderen Arbeitsthreads ausgelöst, der auf Clientverbindungen wartet und die TIdContextThreads erstellt.

Ja, TIdTCPServerEreignishandler müssen beim Zugriff auf UI-Steuerelemente und andere gemeinsam genutzte Daten mit dem Hauptthread synchronisiert werden.

1 NamoRamana Sep 08 2020 at 20:59

Ich glaube, es wird in einem eigenen Thread-Kontext aufgerufen. Besser mit Synchronize () oder Queue () zu schützen ... Beispiel:

procedure TMainForm.IdTCPSyncServerConnect(AContext: TIdContext);
var
  AClientIP: string;
begin
 
  AClientIP := AContext.Binding.PeerIP;
  TThread.Synchronize(nil,
    procedure
    var lItem : TListItem;
    begin
      Inc(FClientCount);
      lblClientConnections.Caption := IntToStr(FClientCount);
      lItem := lstClients.Items.Add;
      lItem.Caption := AClientIP;
      lItem.SubItems.Add(AClientIP);
      lItem.SubItems.Add(DateTimeToStr(Now));
    end
  );
end;