Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2004
JDNA JDNA is offline
Miembro
 
Registrado: mar 2004
Posts: 17
Poder: 0
JDNA Va por buen camino
Question Como hacer un cliente Indy con threads

Hola amigos, estoy haciendo un programa cliente/servidor que recibe imagenes en tiempo real y a la vez manda información al servidor, el servidor funciona muy bien, el problema es con el cliente. Cuando recive las imagenes creo un hilo y leo los datos con ReadStream y un timer para hacerlo cada determinado tiempo y aparte tengo unos botones que envian información al servidor como que deje de enviar imágenes, etc:
while Cliente.connected do
Cliente.ReadStream(Stream, -1, True);

La información le mando con WriteBuffer y también he creado un hilo para cada boton, pero cuando está conectado a internet ocurre que la aplicación se comporta como si no tuviera hilos, osea que cuando está recibiendo las imagenes y se apreta un boton, el programa está paralizado (si se puede decir asi) y no hace caso a nada, hasta que pasa el tiempo del timer y la aplicación vuelve a su estado normal pero cuando se activa nuevamente el timer, la aplicación se paraliza y la verdad da lo mismo que el código se ejecute con o sin hilos, el efecto es el mismo. Alguien me puede aconsejar o dar alguna sugerencia o decirme que está mal. A alguien le ha pasado algo parecido???
Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 24-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
El problema debe ser que estas ejecutando el código del ReadStream, o el timer en el hilo principal de la aplicación. Porque no mostras un poco de código, o explicas que corre en cada hilo para ver que puede estar tirando mal...

Ademas ese "cuando esta conectado a internet" significa que si esta conectado a una pc de la red local, todo funciona como debiera??? caso muy extraño, pues si estas conectado a internet, a otra pc, o incluso a un servidor corriendo en local, no tendria por que afectar el comportamiento...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 24-05-2004
JDNA JDNA is offline
Miembro
 
Registrado: mar 2004
Posts: 17
Poder: 0
JDNA Va por buen camino
Código fuente

Holaaa Jachguate, gracias por responder, el problema bueno no es solo cuando está conectado a internet, solo que se hace más notorio, en realidad en una red LAN también sucede lo mismo pero como la velocidad de transmisión es mucho más rápida que una conexión dial-up, no se nota tanto. Aqui está un poco del código fuente, haber si puedes identificar que estoy haciendo mal:



Este es el hilo que se encarga de recibir las imágenes:
Código:
 
unit UReciveImagenes;
 
interface
 
uses
Classes, Jpeg, UPrincipal, SysUtils;
 
type
TRecibirImagenes = class(TThread)
private
{ Private declarations }
protected
procedure CapturarImagenes;
procedure Execute; override;
end;
 
implementation
uses
UControlCliente;
 
 
procedure TRecibirImagenes.CapturarImagenes;
var
stream: TStream;
jp: TJPEGImage;
conectado : boolean;
mensaje : string;
EnviarInformacion : TDatosUsuario; //En UControlCliente
begin
.
.
.
Cliente.WriteBuffer(EnviarInformacion, sizeof(EnviarInformacion));
while Cliente.connected do
Cliente.ReadStream(Stream, -1, True);
.
.
.
end;
 
 
{ Place thread code here }
procedure TRecibirImagenes.Execute;
begin
Synchronize(CapturarImagenes);
Terminate;
end;
 
end.
--------------------------------------------------------------

Este es el código de la unidad donde se crea el hilo con un timer:

Código:
unit UControlCliente;
 
interface
type
TControlCliente = class(TDataModule)
Timer1: TTimer;
Cliente: TIdTCPClient;
.
.
.
Public
procedure CrearHilo;
end;
 
 
var
ControlCliente: TControlCliente;
RecibirImagenes : TRecibirImagenes;
 
 
implementation
.
.
.
procedure TControlCliente.Timer1Timer(Sender: TObject);
begin
CrearHilo;
end;
 
 
procedure TControlCliente.CrearHilo;
begin
RecibirImagenes := TRecibirImagenes.Create(TRUE);
RecibirImagenes.Priority := tpNormal;
RecibirImagenes.Resume;
RecibirImagenes.WaitFor;
end;
.
.
.
end;
-------------------------------------------------------

Y desde la forma principal llamo activo el timer:


Código:
 
procedure TFPrincipal.Conectar1Click(Sender: TObject);
begin
.
.
.
ControlCliente.Timer1.Enabled := TRUE;
end;
---------------------------------------------------------

Bueno hasta aqui funcionaria bien pero tengo otros botones que me mueven una cámara y cuando los apreto se paraliza el programa por un instante mientras el código del timer se ejecuta, por ejemplo el timer se acvita cada 1 segundo entonces los botones se pueden apretar aproximadamente cada segundo, me parece que esta linea de código hace que todo el programa no responda:

while Cliente.connected do
Cliente.ReadStream(Stream, -1, True);

Lo más extraño es que sin hilo el comportamiento es el mismo, realmente los hilos no mejoran en nada su desempeño.

--------------------------------------------------------------
Esta es la unidad que envia información al servidor para que mueva la cámara:

Muchas gracias.

JDNA.

Última edición por JDNA fecha: 25-05-2004 a las 22:46:13. Razón: Corección
Responder Con Cita
  #4  
Antiguo 25-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola. Si queres que revise tu código, mejor aprendé a usar la etiqueta [ code ] y la etiqueta [ delphi ] y edita tu mensaje anterior. Además, me parece que lo has puesto todo, y basta con las partes medulares...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:03:45.


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
Copyright 1996-2007 Club Delphi