Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema leyendo datos de TIdTCPClient

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema leyendo datos de TIdTCPClient Responder citando

Hola a todos,

Os cuento mi problemilla.

Tengo un TIdTCPClient y un TIdIOHandlerStack, en un memo meto los datos que voy recibiendo del TIdIOHandlerStack con la siguiente linea:

Memo1->Lines->Add(IdIOHandlerStack1->ReadLn());

Y la linea que recibe me la mete en el Memo, el problema es que puede que me envien ahora 1 linea, mas tarde 3 lineas mas y asi siempre, que pasa que o pongo un Timer que ejecute cada cierto tiempo el ReadLn() o no tengo forma de recibir la informacion y claro cuando son varias seguidas pues las va poniendo despacito una a una a no ser que el Timer lo ponga muy corto y entonces relentiza el programa.

Mirando mirando he visto la funcion ReadStrings, que puedo decirle cuantas lineas estoy esperando, pero como no se cuantas son pues pongo un 0 que creo que es lo correcto para que reciba todo lo que tiene, de la siguiente forma:

IdIOHandlerStack1->ReadStrings(Memo1->Lines,0);

Pero se me queda bloqueado por que se queda escuchando todo el rato y si pongo que recibe 2 o 5 o las lineas que sean pues estamos en las mismas que con ReadLn()

No hay forma de que en el momento que reciban datos lo sepa? como antes en el builder 6 yo tenia un evento en TIdTCPClient que me avisaba cuando llegaban datos y asi los metia en el Memo.

Se os ocurre algo?

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Carlos J. Fernandez escribió:
como antes en el builder 6 yo tenia un evento en TIdTCPClient que me avisaba cuando llegaban datos

A que evento te refieres ? Quizás te refieres al componente TClientSocket que si trabaja de manera asíncrona ?

Carlos J. Fernandez escribió:
Mirando mirando he visto la funcion ReadStrings, que puedo decirle cuantas lineas estoy esperando, pero como no se cuantas son pues pongo un 0 que creo que es lo correcto

Cuando pones el "0" lo que le estas indicando realmente es que el primer dato que va a recibir es un entero que le indicara cuantas líneas tiene que leer (aparte de que lo pone en la ayuda, esta comprobado).

Si usas Indy y no quieres bloqueos tendrás que usar otro hilo/tarea. O bien si en versiones anteriores usabas el componente "TClientSocket/TServerSocket", en las nuevas no viene instalado por defecto, pero puedes agregarlo a la paleta, lo encontraras en el subdirectorio "BIN" del C++Builder y se llama "dclsocketsXXX.bpl" (XXX cambia según la versión) y está en todas incluida la 2010.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo,

Yo que se, lo he intentado todo, hasta con un hilo y no consigo que funcione bien, como lo harías tu?

La idea es que funcione como el Hiperterminal mas o menos, le dices una IP y un puerto y se conecta, cuando va recibiendo datos van entrando y los pone en un Memo y cuando no le llegan esta a la espera pero no bloquea el resto de la aplicación.

Se te ocurre algo?

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Carlos J. Fernandez escribió:
como lo harías tu?

Yo lo haría usando otro hilo. Aunque depende de que protocolo se vaya a usar. Habría que ver tu código para ver porque te falla..

Carlos J. Fernandez escribió:
La idea es que funcione como el Hiperterminal mas o menos...

Para esto yo creo que es más sencillo que uses como te decía "TClientSocket" que trabaja de manera asíncrona, o bien usar Winsock directamente de manera asíncrona (que es lo que encapsula este componente). Ya que Indy está diseñado para trabajar de manera síncrona, y aunque así también se puede hacer, tendrías que usar otros hilos..

Carlos J. Fernandez escribió:
Se te ocurre algo?

Quizas te sirva lo siguiente:
Código:
IdTCPClient1->Host = "www.google.es";
IdTCPClient1->Port = 80;
IdTCPClient1->Connect();

IdTCPClient1->IOHandler->WriteLn("GET / HTTP/1.1\r\nHost: www.google.es\r\n");

IdTCPClient1->IOHandler->CheckForDataOnSource(250);
while (!IdTCPClient1->IOHandler->InputBufferIsEmpty())
{
    Memo1->Lines->Add(IdTCPClient1->IOHandler->InputBufferAsString());
    IdTCPClient1->IOHandler->CheckForDataOnSource(250);
}


Carlos J. Fernandez escribió:
como antes en el builder 6 yo tenia un evento

Si estabas satisfecho con tu código anterior, lo ideal sería verlo y adaptar lo necesario para que siga funcionando.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo,

Muchas gracias,

Voy a ponerme con ello a ver si lo consigo ya de una vez y te cuento.

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.