Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TIdTCPClient - WirteStream simultáneo? (https://www.clubdelphi.com/foros/showthread.php?t=67658)

jplj 28-04-2010 21:01:41

TIdTCPClient - WirteStream simultáneo?
 
Hola

Quería hacer una pregunta -quizá obvia- sobre TIdTCPClient.WirteStream.

Tengo lo siguiente:
Código Delphi [-]
... Cliente:TIdTCPClient ... // En el evento OnTimer de un Timer con intervalos de 1 seg. Cliente.WriteStream( COMANDO_CADA_SEGUNDO ) // Procedimiento de escritura Cliente.WriteStream( COMANDO_XXX )
Por una parte cada segundo escribo un comando constante, y por otra parte a petición de la aplicación escribo otros.

Si se produce una escritura simultánea desde el evento OnTimer y desde el procedimiento el TIdTCPClient lo resolvería, o bien debo gestionarlo / impedirlo desde la aplicación.

Uso Delphi 7 / Indy 9

Muchas gracias de antemano.

DarkMan 29-04-2010 00:21:49

Depende:

-Si existe un solo componente para manejar todas las operaciones y solamente interviene un hilo de ejecución.
-Si existe un solo componente para manejar todas las operaciones e intervienen varios hilos de ejecución.
-Si existe un componente determinado y diferenciado para cada hilo de ejecución.

En el primer y tercer caso no necesitarías manejar la concurrencia.
En el segundo caso si deberías manejar la concurrencia.

Si no te queda claro adelante, vuelve a preguntar.

jplj 29-04-2010 09:37:04

Muchas gracias por la respuesta.

Los procesos de escritura se realizan con un solo componente y en el hilo principal (1º caso) , pero -simpre lo hay- tengo un hilo que usa el mismo componente para realizar lecturas (Cliente.ReadStream(...) ).

Código Delphi [-]
procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not FCliente.Connected then
      Terminate
    else
    begin
      try
        FCliente.ReadBuffer(CB, SizeOf (CB));
//        Synchronize(HandleInput);
      except
      end;
    end;
  end;
end;

¿Podría haber problemas de concurrencia entre los procesos Cliente.WriteStream() del hilo principal y los procesos Cliente.ReadStream(...) del segundo hilo?

DarkMan 29-04-2010 11:30:44

Cita:

Empezado por jplj
Los procesos de escritura se realizan con un solo componente y en el hilo principal (1º caso) , pero -simpre lo hay- tengo un hilo que usa el mismo componente para realizar lecturas (Cliente.ReadStream(...) ).

Entonces hablamos del 2º caso, podría existir un problema de concurrencia.

WriteStream o ReadStream, son funciones que requieren bastante tiempo. Al estar ejecutándose en hilos diferentes puede que se ejecuten simultáneamente, lo que podría provocar una serie de errores (que se mezclasen los datos o vete tú a saber, desconozco el funcionamiento interno de estos componentes indy, tal vez usen un mismo buffer para ambas funciones).

Lo correcto es que cuando termine una función, dé señal al otro hilo para utilizar la otra función y/o viceversa.

Espero haberte ayudado.
Un saludo.

jplj 29-04-2010 13:45:43

Muchas gracias.
Echaremos mano de un mutex.


La franja horaria es GMT +2. Ahora son las 16:01:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi