Pregunta: Lo que estoy buscando es la más típica o mejores prácticas manera de utilizar un hilo separado para recibir datos utilizando un IdTCPClient en Indy 10.Indy 10 IdTCPClient Leyendo datos usando un hilo separado?
Antecedentes: El código siguiente es una muestra de lo que estoy tratando de hacer con las piezas de procesamiento de datos reales eliminadas para mayor claridad. La idea del subproceso es recibir todos los datos (tamaño variable con un encabezado que declara el resto de la longitud del mensaje) y luego analizarlos (eso es lo que hace el procedimiento HandleData) y activar un manejador de eventos según el comando.
El TIdIOHandlerSocket se pasa al hilo por la aplicación principal que también escribe datos en el zócalo cuando sea necesario.
TScktReceiveThread = class(TThread)
private
{ Private declarations }
procedure HandleData;
protected
procedure Execute; override;
public
FSocket: TIdIOHandlerSocket;
constructor Create(CreateSuspended: boolean);
end;
procedure TScktReceiveThread.Execute;
var
FixedHeader: TBytes;
begin
Assert(FSocket <> nil, 'You must assign the connected socket to the receiving thread');
SetLength(FixedHeader, 2);
while not Terminated do
begin
if not FSocket.Connected then
Suspend
else
begin
FSocket.CheckForDataOnSource(10);
if not FSocket.InputBufferIsEmpty then
begin
FSocket.ReadBytes(FixedHeader, SizeOf(FixedHeader), false);
// Removed the rest of the reading and parsing code for clarity
Synchronize(HandleData);
end;
end;
end;
end;
Como un prefijo, he utilizado otra pregunta StackOverflow que se ocupa de los componentes del servidor de Indy: "Delphi 2009, Indy 10, TIdTCPServer.OnExecute, how to grab all the bytes in the InputBuffer" para obtener la base de lo que tengo hasta ahora.
¡Gracias por cualquier ayuda!
Esto es muy elegante, pero ¿ha publicado la implementación completa en cualquier lugar? No pude encontrar la implementación completa de la clase TMotileThreading en su publicación. – jamiei
Agregué mi implementación a la respuesta. – jpfollenius
Gracias Smasher: no puedo recordar por qué no lo acepté cuando se publicó originalmente, pero ahora se acepta. ;) – jamiei