Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2008
pulpin pulpin is offline
Miembro
 
Registrado: feb 2008
Ubicación: medellin,colombia
Posts: 53
Poder: 17
pulpin Va por buen camino
problema con thread

amigos una ves mas recurro a su ayuda, lo que sucede es que dentro de mi programa se lleva acabo un retardo necesario para el funcionamiento del mismo, pero bueno este retardo que en si esta da do por una funcion del tipo
WaitForSingleObject detiene el resto de mi programa impidiendo que en este se lleven acabo otras funciones como oprimir un boton, el retardo es de unos 3 segundos, aca mi pregunta: como puedo evitar que este retardo dentro de el hilo detenga la ejecucion del resto de mi programa, de antemano muchas gracias?
Responder Con Cita
  #2  
Antiguo 23-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
¿Estás obligado a usar WaitForSingleObject?, Existen otras formas de esperar a que termine un thread sin un bloqueo total de la aplicación.

Código:
// Declaras una variable de la clase bool Terminado, porque Terminated no es accesible desde fuera. Le asignas true en el thread al terminar.

for(;!MyThread->Terminado;){
    Application->ProcessMessages();
}
La aplicación espera a que el thread termine pero no se bloquea.

Saludos.
Responder Con Cita
  #3  
Antiguo 23-04-2008
luiggixD luiggixD is offline
Miembro
 
Registrado: dic 2006
Ubicación: Lima - Peru
Posts: 32
Poder: 0
luiggixD Va por buen camino
Esa funcion la estas llamando desde un hilo o la usas en medio de tu aplicacion? Yo creo que no estas empleando hilos, y lo que dice escafandra es inconsistente por el concepto de los hilos. Cuando creas un hilo, en su funcion Execute() debes hacer algo asi:

Código:
void __fastcall TUnThread::Execute()
{
  //algun codigo si es q lo necesitas
  while(!Terminated) // agregas mas casos en los que puede terminar tu hilo
  {
  //codigo de lo que hace tu hilo
  }
  //si necesitas que se haga algo mas antes que el hilo termine
}
En caso que no estes usando hilos en tu aplicacion, esta re va a detener cuando llames a la funcion que propones si la llamas desde el Form. Si llamas a la funcion desde un hilo, tu aplicacion funcionara correctamente.

Una nota ultima, el Application->ProcessMessages(); no es una mala idea pero de todas maneras no es una buena practica. Lo mas recomendable (aunque un poco complicado) es emplear hilos.

Espero que te ayude

Luiggi
Responder Con Cita
  #4  
Antiguo 23-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
luiggixD, Perdona pero no me parece inconsistente, de hecho lo utilizo para esperar a la terminación de un thread en un programa que estoy escribiendo y que debe esperar, solo que no uso WaitForSingleObject, que congela toda la aplicación, sino el sistema que he descrito. Es posible que no me explicase bien, de forma que amplio un poco tu código de ejemplo añadiendo mi idea:


Código:
void __fastcall TUnThread::Execute()
{
   Treminado = false; // Variable que añadimos como miembro a TUnThread


  //algun codigo si es q lo necesitas
  while(!Terminated) // agregas mas casos en los que puede terminar tu hilo
  {
  //codigo de lo que hace tu hilo
  }
  //si necesitas que se haga algo mas antes que el hilo termine



  Terminado = true; // Variable que añadimos como miembro a TUnThread
}
En la aplicación Codigo de espera a la terminación del thread:

Código:
Form1::Funcion(){
// Creamos el Thread y comienza la ejecución
.
.
.
// Ahora necesito esperar....
for(;!TUnThread->Terminado;){
    Application->ProcessMessages();   // Permite procesar mensajes y evitar la "congelación total" de la aplicación.
}
.
.
.
}
Durante la espera se pueden procesar mensajes y por lo tanto otros eventos, sólo se bloquea el código de la función que está esperando.


Saludos.
Responder Con Cita
  #5  
Antiguo 23-04-2008
luiggixD luiggixD is offline
Miembro
 
Registrado: dic 2006
Ubicación: Lima - Peru
Posts: 32
Poder: 0
luiggixD Va por buen camino
En teoria el hilo no debe detener a la aplicacion. Si dentro del hilo realizas operaciones que interactuan con el Form o con cualquier otra parte de tu aplicacion, lo mejor seria sincronizar(funcion_form), donde funcion_form es una funcion que defines dentro del hilo que encapsula todas las interacciones con el form, ahora puedes elaborar muchas mas funciones. El hilo no deberia detener al programa, y asi no empleas el Application->ProcessMessages();

me deje entender??

me parece raro que se congele tu programa empleando hilos XD! quizas en tu misma aplicacion estes haciendo algo que la retrase
Responder Con Cita
  #6  
Antiguo 23-04-2008
pulpin pulpin is offline
Miembro
 
Registrado: feb 2008
Ubicación: medellin,colombia
Posts: 53
Poder: 17
pulpin Va por buen camino
muchas gracias a ambos por su ayuda, pero creo que yo me he equivocado ya que siento que no me he explicado bien, cuando le doy "imag->Resume();"
el hilo inicia, en ese momento mi hilo llama a una funcion invocada desde una dll (de la cual tengo el codigo fuente) esta funcion esta definida en el programa principal y no en el hilo, la funcion usa un WaitForSingleObject, esta funcio detiene por completo mi programa tanto el hilo "que es el que se debe detener por este tiempo", y el resto de la aplicacion en la cual no puede ni presionar otro boton. espero les sea mas claro, gracias amigos.
Responder Con Cita
  #7  
Antiguo 23-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por luiggixD Ver Mensaje
En teoria el hilo no debe detener a la aplicacion. Si dentro del hilo realizas operaciones que interactuan con el Form o con cualquier otra parte de tu aplicacion, lo mejor seria sincronizar(funcion_form), donde funcion_form es una funcion que defines dentro del hilo que encapsula todas las interacciones con el form, ahora puedes elaborar muchas mas funciones. El hilo no deberia detener al programa, y asi no empleas el Application->ProcessMessages();

me deje entender??

me parece raro que se congele tu programa empleando hilos XD! quizas en tu misma aplicacion estes haciendo algo que la retrase
..Si, tienes razón, el hilo no debe ni detiene la aplicación, la que lo detiene es la función WaitForSingleObject hasta que termina el hilo que se le pasa como parámetro (Handle).

El hilo debe interactuar con Synchronize con el form. Pero imagina que parte del código no puede seguir sin conocer un resultado. Y que ese resultado va a tardar en saberse. Entonces te puede interesar colocar en un hilo el código que sabes que va a tardar y por lo tanto semibloquear la aplicación unos segundos. ¿Y la espera...? Si la espera la haces con WaitForSingleObject, entonces es un desastre...

Con el sistema que propongo, la aplicación no espera nada, los eventos siguen ocurriendo, lo único que espera es el código que mantiene el bucle descrito.

Te preguntarás: Si al final usas ProcessMessages(), ¿Entonces porqué programar un hilo?. Pues para que las llamadas a ProcessMessages() no se interrumpan por la tarea que más tarde, por ejemplo una conexión a internet o llamada a procesos API que obligan a esperar...

Como pulpin ha hecho la pregunta, he dado por hecho que estaba ante una situación como la que describo y por eso le propongo esto. Evidentemente es sólo para estos casos especiales de describo.

De todas formas pulpin ha resuelto su problema.


Saludos.

Última edición por escafandra fecha: 23-04-2008 a las 18:23:50.
Responder Con Cita
  #8  
Antiguo 23-04-2008
pulpin pulpin is offline
Miembro
 
Registrado: feb 2008
Ubicación: medellin,colombia
Posts: 53
Poder: 17
pulpin Va por buen camino
no porque mi hilo esta en ejecucion y la funcion necesariamente se tiene que detener durante ese tiempo mientras le llegan otros datos, cuando espera el rsto de mi programa deberia estar en funcionamiento normal.

cuando recibe los datos el hilo sigue su funcionamiento normalmente.

eje:

Form
{
codigo form incluyendo botones y demas;
invoco la funcion recibo datos(desde una dll);
}
inicio de hebra
{
recibo datos(estafuncion contiene el wait.....); //aqui es donde se para //todo mi programa por 3 segundos, cada que pasa por este sitio, y solo //deberia parar en el hilo.
}

espero ser mas ilustrativo
Responder Con Cita
  #9  
Antiguo 23-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El problema es que WaitForSingleObject para todo. Lo que no entiendo es si la llamas tú o si lo hace la dll. Si la llamas tú, sabrás cual es el proceso que esperas que termine... No debería llamarse desde un hilo pues deja de tener sentido ese hilo.

Si puedes:

Código:
función(...)
{
   .
   .
   // Necesito datos.
   Abro hilo que me da datos
   
  //espero datos. Mi aplicación no se detendrá, pero si esta función.
   for(;hilo->Terminado==false;) Application->ProcessMessages();
  
  // Ya tengo los datos y sigo con la función
  .
  .
}

¿Te sirve?

Saludos.
Responder Con Cita
  #10  
Antiguo 23-04-2008
pulpin pulpin is offline
Miembro
 
Registrado: feb 2008
Ubicación: medellin,colombia
Posts: 53
Poder: 17
pulpin Va por buen camino
pues escafranda desafortunadamente no puedo escaparme del waitforsingleobject ya que este esta dentro del codigo de la dll y es necesario .

Responder Con Cita
  #11  
Antiguo 23-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Mala cosa. Revisa esto, aunque posiblemente lo has hecho.

Dices que tienes el código fuente de esa dll.... Podrias modificarla y recompilarla. Sólo es una idea aunque posiblemente la peor.

Saludos.


EDITO:

Mira WaitForMultipleObjects también por si te sirve.

Última edición por escafandra fecha: 23-04-2008 a las 19:32:16.
Responder Con Cita
  #12  
Antiguo 25-04-2008
pulpin pulpin is offline
Miembro
 
Registrado: feb 2008
Ubicación: medellin,colombia
Posts: 53
Poder: 17
pulpin Va por buen camino
igualmente gracias por tu ayuda escafranda, voy a ver como puedo resolver este inconveniente, espero no se me salga de las manos.

post: tu siempre salvandome de tanto enredo, ya te debo como 5.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 00:16:30
Thread y Form progmaq Varios 4 31-03-2005 14:16:50
Problema con Thread e Indy diegofhernando Varios 3 30-03-2005 22:20:24
Problema cerrando un thread tortelini Varios 0 14-03-2005 15:21:16
Hilos o Thread DarkByte Varios 7 20-11-2003 17:10:44


La franja horaria es GMT +2. Ahora son las 16:44:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi