FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
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 |
#4
|
||||
|
||||
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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|