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 

evento OnTerminate... en un Thread

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: evento OnTerminate... en un Thread Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Mensaje    Asunto: Responder citando

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..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
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.