| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Perico Invitado
|
Publicado: Mie 27 Abr, 2005 11:35 am Asunto: MultiThreading Ping Appliation |
|
|
he estado probando a lanzar múltiples ping a la vez, cada un en un Thread diferente.
En un principìo parece que funciona bién, pero la realidad es otra.
Los Threads estan creados dinamicamente (a partir del Unit2, donde esta creado MiHilo que es un TThread) y eso aseguro que funciona bién, y cada ping es lanzado desde un TIdIIcmpClient distinto también creado dinamicamente.
En OnReply de cada IcmpClient recojo la respuesta, y aqui es donde encuentro el fallo, ya que las ip desde donde obtego las repuestas de los pings (que deberian ser las mismas que la que hay en IcmpClient->Host) suelen estar cambiadas o repetidas.
He probado con:
EnterCriticalSection(&Form1->CS);
funciona bien, pero lo que pasa es que me va haciendo los pines uno tras otro.
Creo que el problema es que al enviar varios ping a la vez a diferentes IP, las respuestas de los pings se van "colocando" erroneamente.
a que puede deberse?
Es el ping de IdIcmpClient safe-thread realmente?
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 27 Abr, 2005 6:42 pm Asunto: |
|
|
Hola, en la versión 9 de los Indy que es la que utilizo se soluciona llamando al ping del siguiente modo:
IdIcmpClient1->Ping("PING", ThreadID);
Lo importante es el segundo parámetro, tiene que ser un número único que ayude a identificar las diferentes llamadas. En este caso he usado ThreadID porque este valor es distinto para cada TThread.
Lo que no se es si esto mismo servirá para la versión 8 de los Indy, que es la que viene instalada de fabrica con el C++Builder 6, porque no la tengo instalada para comprobarlo. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Jue 28 Abr, 2005 8:26 am Asunto: |
|
|
Gracias.
Como puedgo actualizar los coponentes Indy? cual es el método más sencillo?
me he bajado Indy_9_00_17.scr pero no se que hacer ahora.
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 29 Abr, 2005 10:00 pm Asunto: |
|
|
Normalmente las instrucciones van dentro de un archivo de texto dentro del propio archivo comprimido.
Si quieres evitarte conflictos entre las dos versiones lo mas simple es que desinstales antes la versión 8 desde agregar o quitar programas del panel de control, en la opción "Borland C++Builder 6" le das a cambiar y ahí desmarcas indy...
Y dentro de "Indy_9_00_17.zip" veras que hay un archivo llamado FULLC6.BAT con eso puedes compilarlo fácilmente y listo, agregas el .BPL generado igual que cualquier otro PACKAGE. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Sab 30 Abr, 2005 1:07 am Asunto: |
|
|
| Gracias _Leo |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Mar 10 May, 2005 10:59 am Asunto: |
|
|
Buenas,
he probado lo que me comentas _Leo, he instalado los Indy9 (por cierto los iconos nuevos muy bonitos). EL problema es que en la función Ping del IdIcmpClient me da un problema:
si hago
int num;
num=1;
IcmpClient1->Ping("Ping", num);
me da un error que dice "Extra parameter..."
no se que puedo hacer, no he encontrado nada parecido en el foro ni en las news de google
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 10 May, 2005 11:32 am Asunto: |
|
|
He probado lo que has puesto y no me da ningún error. Es posible que se este cargando alguna cabecera de la versión 8 donde Ping no tiene parámetros y de ahí el mensaje de error.
Mira en el directorio "\Archivos de programa\Borland\CBuilder6\Include" (o donde tengas instalado el BCB) y asegúrate de que no haya ahí cabeceras relacionadas con Indy (que serán las de la versión anterior), casi todas empiezan por "Id..." por ejemplo:
IdBaseComponent.hpp
IdComponent.hpp
IdIcmpClient.hpp
IdRawBase.hpp
IdRawClient.hpp
...
o sobrescríbelas con las de la versión 9, como te sea más comodo a ti para trabajar. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Mar 10 May, 2005 2:05 pm Asunto: |
|
|
Gracias _Leo, ahora ya funciona la parte de la instalación de los Indy9.
pero cuando yo hago:
unsigned int id;
Ping("hola",id);
como puedo ver en el OnIdIcmpClientReply de que ping se trata?
es decir como puedo saber los valores de la varibles id que envié como parámetro en el OnReply para poder saber quien lo envió?
Gracias
Me temo que estoy preguntando algo obvio... pero es que estoy algo nublado... |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 10 May, 2005 5:41 pm Asunto: |
|
|
El valor lo tienes en "AReplyStatus.SequenceId", pero no necesitas usarlo a menos que estes enlazando el mismo evento para los dos.
O sea, que si lo haces dentro de un TThread y cada uno tiene su evento de recepción independiente no necesitas discriminar tu por ese valor, al dárselo ya lo hace el automáticamente, no se si me explico. |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Mar 10 May, 2005 9:48 pm Asunto: |
|
|
Hola de nuevo,
en realidad lo que tengo es un vector de una clase que he creado llamada nodo, que contiene un String con la IP,TIdIcmpClient y un hilo (Tipo MiHilo que es u TThread declarado en el Unit2).
cada nodo que creo, le añado dinamicamente el TIdIcmpClient con new.
Entonces recorro el vector desde i=o hasta v.size()
y hago en cada pasada:
nodo[i]->hilo= new MiHilo(This); // se crea el hilo
nodo[i]->hilo->IDnodo=i; // (int) IDnodo; es para saber que nodo hace el ping en el OnExecute (la idea funciona bien)
nodo[i]->hilo->FreeOnTerminate();
nodo[i]->IcmpClient->Tag=i; // para el OnReply identificar de quien era el ping
nodo[i]->IcmpClient->Host=nodo[i]->IP; //le decimos la direccion ip
nodo[i]->hilo->Resume(); // ejecutamos
entonces en el execute de hilo es donde tiene que ejecutarse esto:
nodo[IDnodo]->IcmpClient->Ping();
y en el OnReply he de saber de que ping me llega la respuesta.
Yo lo hago asi:
int vienede; // variable que recoje el identificador del nodo que hizo el ping
vienede=((TIdIcmpClient *) ASender)->Tag;
....
ahora escribiria en un memo los resultados
todo esto no daba error en el tema de identificación del nodo, pero si en la identificacion de la IP de respuesta.
Bueno, ahora con el nuevo Indy9 la cosa cambia, lo que no se es como utilizarlo, puede que lo tenga todo mal planteado desde le principio.
De todas formas gracias por ayudarme _Leo (si te pasa por aqui por Gran Canaria a visa por que estas invitado a unos piscos) |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Jue 12 May, 2005 9:40 am Asunto: |
|
|
Bueno ahora que lo he probado creo que ya entiendo lo que me querias decir.
Y es que ahora funciona de maravilla pero solo si lo envio con parametros Ping("Ping", PingID); de esta forma las respuestas de los ping son las correctas, pero si pongo Ping(); asi a secas pues no funciona bien.
Otra cosa es que no hace falta recojer el SecuenceID en el OnReply para identificar el ping, pero yo lo hago y va bién.
Gracias. |
|
| Volver arriba |
|
 |
|