 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Perico Invitado
|
Publicado: Mie 27 Jul, 2005 7:55 pm Asunto: evento OnTerminate... en un Thread |
|
|
Hola,
estoy creando Threads dinamicamente, osea instancias de otro.
Como puedo saber cuando ha terminado la ejecución de un Thread si tengo puesto FreeOnTerminate();
Como puedo hacer por ejemplo que una vble se incremente justamente al terminar el thread?
Como puedo implementar algo parecido en caso de que no exista OnTerminate?
Gracias |
|
| Volver arriba |
|
 |
Crandel Lt


Registrado: 31 May 2005Mensajes: 94Ubicación: Argentina
|
Publicado: Jue 28 Jul, 2005 12:58 am Asunto: |
|
|
Que es exactamente lo que quieres hacer?
si incrementas una variable dentro de la clase cuando se esta por destruir la vas a perder Confused
Podrías incrementar una variable externa. Pero como sabrías que hilo se termino, solo sabrias cuantos fueron y no quien fue.
Puedes asignar el evento OnTerminate a un método de tu formulario y ahí capturas la finalización.
Abajo hay un link de mi pagina donde hablo de eventos, al final del artículo explica como asignar el evento a un método.
Suerte _________________ Crandel
"hay 10 tipos de personas, las que ven en binario y las que no"
Angel Zeitoune - Artículo: Generación de eventos en C++Builder |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Jue 28 Jul, 2005 11:36 am Asunto: |
|
|
Hola Crandel,
primero, gracias por responder.
El tema esta en que yo creo una clase
class MiHilo : public TThread
y despues voy creando instancias
nodo=new MiHilo(this);
nodo->FreeOnTerminate=true;
nodo->Resume();
pero lo que sucede es que dentro del hilo creado se va a ejecutar la función ping de IcmpClient, y como sabes el ping tiene un tiempo de respuesta, entonces el hilo ejecuta ->Ping();
Pero como quiero hacer ping cada 5 segundos pues lo tengo dentro de un Timer, dentro del OnTimer.
pero no se si el hilo a terminado cuando le toca hacer otra vez el ping
y si pongo
nodo->Terminate(); // o nodo->Free();
nodo=new MiHilo(this);
nodo->FreeOnTerminate=true;
nodo->Resume();
tampoco va, y eso que lo elimino antes.
Gracias |
|
| Volver arriba |
|
 |
Crandel Lt


Registrado: 31 May 2005Mensajes: 94Ubicación: Argentina
|
Publicado: Jue 28 Jul, 2005 7:16 pm Asunto: |
|
|
| Perico escribió: |
y si pongo
nodo->Terminate(); // o nodo->Free();
nodo=new MiHilo(this);
nodo->FreeOnTerminate=true;
nodo->Resume();
tampoco va, y eso que lo elimino antes.
|
no entiendo a que te referís con "tampoco va".
Vos ya creaste un hilo para el ping anterior, para que lo querés destruir o terminar? va a terminar solo.
simplemente lanza un nuevo hilo para el siguiente ping y listo, dejalo al hilo anterior que se libere solo, es decir, comenta la primera línea, como lo tenés al principio.
Espero que te ayude
Suerte _________________ Crandel
"hay 10 tipos de personas, las que ven en binario y las que no"
Angel Zeitoune - Artículo: Generación de eventos en C++Builder |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Jue 28 Jul, 2005 8:34 pm Asunto: |
|
|
Hola de nuevo,
si lo dejo como al principio osea como tu me dices, funciona bien, pero con el task manager de windows veo como la memoria usada por mi programa va aumentando (no mucho unos 8 kb por thread) y es como si no llegase a liberar la memoria usada para los threads.
He probado a crear un thread con un botón (pero sin ejecutar) y otro botón para hacer un delete y funciona bien, al pulsar el 1º botón, me crea el thread y la memoria usada aumenta 8k y al pulsar el 2º botón me libera los 8k de la memoria.
Pero he descubierto con esto que si pulso el 1º botón varias veces, me va quitando 8k de la memoria cada vez que lo pulso, osea si lo pulso 10 veces me quita 80 kb. Y al pulsar el 2º ´botón solo libera 8k (si vuelvo a pulsar el 2º botón me da error). |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 28 Jul, 2005 9:20 pm Asunto: |
|
|
Bien, asi como esta hablando, es un poco dificil, entender, el procedimiento de tu Hilo.
intenta generar el hilo de la siguiente manera
creamos el hilo
| Código: | MiHilo *nodo=new MiHilo(this); |
dentro del constructor del Hilo que mencionas debes poner lo siguiente
| Código: | __fastcall MiHilo::MiHilo(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpNormal;
FreeOnTerminate = false;
} |
y por ultimo para terminar, tu codigo, o la ejecucion del hilo, debes poner lo siguiente
| Código: | nodo->Terminate(); |
digo esto por que dentro del constructor, del nodo, no estableces, la variable de inicio CreateSuspended, a true, ya que si lo hicieras, el hilo, se crea, pero no se ejecuta, bien, como pudes, ver, sin codigo es un poco dificil, por sobre ende, sabemos que dentro del metodo ::Execute(), no puedes hacer refrencia a ningun componente de la VCL, a excepcion, checa, tus variables, posiblemente, creas, variables dentro del metodo execute, y eso hace que cada vez que el hilo se ejecute, incremente la memoria, como estas variables, no se eliminan, y el hilo es concurrente, pues te va a incrementar la memoria
saludos.. _________________
 |
|
| Volver arriba |
|
 |
Crandel Lt


Registrado: 31 May 2005Mensajes: 94Ubicación: Argentina
|
Publicado: Jue 28 Jul, 2005 10:01 pm Asunto: |
|
|
Con el permiso de César,
creo que tu problema esta en que tus hilos no se estan liberando, dado que no concluyen el método execute.
la poner el método FreeOnTerminate a true se deberían liberar la memoria automáticamente sin necesidad de hacer ningún Free ni nada.
Prueba eliminando tu código del método execute y veras como vuelve a disminuir la memoria.
el porque si te la libera con Free, es porque fuerzas a destruir el objeto.
Por otro lado, no puedes hacer dos veces click sobre el botón de destruir porque solo almacenas el puntero de acceso al último hilo creado y una vez destruido, si lo intentas destruir vas a obtener un error.
por último, tu problema no tiene nada que ver con el CreateSuspended, aunque si sería importante que lo fijaras.
el código nodo->Terminate(); es para terminar tu método execute, vos no lo necesitas, dado que estableces el FreeOnTerminate a true para que se destruya automaticamente al finalizar el método execute. _________________ Crandel
"hay 10 tipos de personas, las que ven en binario y las que no"
Angel Zeitoune - Artículo: Generación de eventos en C++Builder |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 28 Jul, 2005 10:37 pm Asunto: |
|
|
Muchas gracias Crandel y César,
He de pediros perdón a los dos ya que en realidad los threads si se liberan con freeOnTerminate=true, el problema estaba en que tengo un std::vector que va guardando los valores de respuesta de los ping y eso es lo que va creciendo con tiempos.resize(tiempos.size())+1;
siento mucho haberles hecho pensar en algo que estaba bien y yo lo volví un problema.
Un saludo |
|
| 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.
|