 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 10 Sep, 2009 6:36 pm Asunto: Problema leyendo datos de TIdTCPClient |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 13 Sep, 2009 7:16 am Asunto: |
|
|
| 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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 14 Sep, 2009 2:32 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 15 Sep, 2009 11:12 pm Asunto: |
|
|
| 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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 16 Sep, 2009 12:03 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|