TIdTCPServer.OnConnect é chamado do thread principal?

Sep 08 2020

Não sei se é possível acessar dados do thread principal no evento TIdTCPServer.OnConnectou OnDisconnect. Este método é chamado a partir do thread principal ou de outro thread? Quero registrar o IP em a TMemoe habilitar ou desabilitar alguns botões.

Respostas

3 RemyLebeau Sep 08 2020 at 22:55

TIdTCPServeré um componente multiencadeado. Seus OnConnect, OnDisconnect, OnExecute, e OnExceptioneventos são todos despedidos no contexto de um segmento de trabalho que é representado pelo evento TIdContextobjeto. Esse thread gerencia a conexão TCP do cliente na TIdContext.Connectionpropriedade.

O OnListenExceptionevento é disparado no contexto de um thread de trabalho diferente, que escuta as conexões do cliente e cria os TIdContextthreads.

Portanto, sim, os TIdTCPServermanipuladores de eventos devem sincronizar com o thread principal ao acessar os controles da IU e outros dados compartilhados.

1 NamoRamana Sep 08 2020 at 20:59

Eu acredito que está sendo chamado em seu próprio contexto de thread .. Melhor proteger usando Synchronize () ou Queue () ... Exemplo:

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;