Hola, no sé si te estará ocurriendo que se bloquee la aplicación, ya que no puedes manipular desde un thread componentes de VCL, y el evento on execute se lanza desde un thread. En el ejemplo que has mostrado, el evento onexecute se ejecuta desde un hilo que se crea para la conexión y no deberías acceder a Memo1. Por otro lado, no sirve de nada comprobar Código Delphi
[-]AContext.Connection.Connected
, ya que si no hay conexión, no se lanza el evento onexecute.
Yo utilizo el sistema que te muestro a continuación ( aunque adaptado a tu ejemplo) en sistemas que tienen conectadas muchas máquinas por sockets y funciona a la perfección y sin problemas con volúmenes altos de mensajes 24x7x365. Sólo tienes que tener la precaución de sincronizar el thread principal de la aplicación con el thread de la conexión, cuando uno se tenga que comunicar con el otro para procesar los mensajes recibidos y para enviar mensajes, siempre que el procesamiento de los datos recibidos los realices en el thread principal.
Código:
Código Delphi [-]procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var Command: string; Size: LongInt; textoRecibido: string; begin Command := AContext.Connection.Socket.ReadLn; Size := AContext.Connection.IOHandler.ReadLongInt(true); textoRecibido := AContext.Connection.IOHandler.ReadString(Size); AContext.Connection.IOHandler.WriteLn( 'Enviado' ); TTCPServidorDatosRecibidos.DatosRecibidos( AContext, Command, textoRecibido); end; procedure TForm1.ProcesaDatosRecibidos( const AIP: string; const ACommand: string; const ATexto: string ); begin Memo1.Lines.Add( DateTimeToStr(now) + ' - ' + AIP + ' : ' + Command ); end Yo utilizo TTCPServidorDatosRecibidos = class(TIdNotify) private FContext: TIdContext; FCommand: string; FDatos: string; protected procedure DoNotify; override; public constructor Create( AContext: TIdContext; const ACommand: string; const ADatos: string ); reintroduce; class procedure DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string ); end; constructorTTCPServidorDatosRecibidos.Create( AContext: TIdContext; const ACommand: string; const ADatos: string); begin FContext := AContext; FCommand := ACommand; FDatos := ADatos; inherited Create; end; procedure TTCPServidorDatosRecibidos.DoNotify; begin inherited; Form1.ProcesaDatosRecibidos( FContext.Binding.PeerIP, FCommand, FDatos ); end; class procedure TTCPServidorDatosRecibidos.DatosRecibidos( AContext: TIdContext; const ACommand: string; const ADatos: string); begin TTCPServidorDatosRecibidos.Create( AContext, ACommand, ADatos ).Notify; end;