TIdTCPServer.OnConnect é chamado do thread principal?
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
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.
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;