Conocer cuando una hebra termina

28/05/2008 - 12:38 por [Juanjo] | Informe spam
Hola grupo:

Tengo un problemilla con la hebras y C# (VS2005) y es que quiero saber
cuando una hebra termina la
ejecución de lo que este haciendo.

Hay algun evento, funcion o lo que sea que se ejecuta cuando una hebra
termina la funcion que tiene que ejecutar?

Gracias.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
28/05/2008 - 13:17 | Informe spam
"[Juanjo]" wrote in message
news:%
Tengo un problemilla con la hebras y C# (VS2005) y es que quiero saber
cuando una hebra termina la
ejecución de lo que este haciendo.

Hay algun evento, funcion o lo que sea que se ejecuta cuando una hebra
termina la funcion que tiene que ejecutar?



¿Por qué no pones directamente una llamada a la función que quieras al
final de la función que ejecuta lo que has lanzado en otra hebra? Si no
puedes modificar esa función, crea una función nueva que llame a la función
original y seguidamente llame a la función que tú quieras, y lanza esta
nueva función en una hebra en lugar de la función que originalmente
llamabas. Por supuesto que en lugar de una función puedes poner un evento si
lo prefieres.

Otra alternativa es usar el patrón de programación asíncrona de .Net
para lanzar tu hebra por mediación de un delegado. Si usas el BeginInvoke
para iniciar la ejecución, uno de los argumentos es precisamente un delegado
para hacerte la retrollamada cuando termine el proceso, con lo que ya te da
resuelta la llamada final.
Respuesta Responder a este mensaje
#2 [Juanjo]
28/05/2008 - 16:10 | Informe spam
Gracias por la respuesta.

El problema que tengo exactamente, es que desde el hilo principal creo una
hebra que lee un fichero con
datos, lo guardo en la base de datos, y muestro los datos en un datagrid
(desde esta hebra actualizo una
barra de progreso para indicar el estado del proceso).

Lo que ocurre es que el hilo principal termina antes de que termina la
hebra, por lo que no muestra los datos.

Si hago:
Thread hebra= new Thread(..);
hebra.start();
hebra.Join();
entonces no me actualiza la barra de progreso porque el hilo principal
espera a la hebra,

Lo que me gustaria es que no hiciera nada el programa (solo actualizar la
barra de progreso) mientras
se produce la carga de los datos.

Alguna idea? De todas formas mirare el BeginInvoke, gracias

"Alberto Poblacion"
escribió en el mensaje de noticias:
"[Juanjo]" wrote in message
news:%
Tengo un problemilla con la hebras y C# (VS2005) y es que quiero saber
cuando una hebra termina la
ejecución de lo que este haciendo.

Hay algun evento, funcion o lo que sea que se ejecuta cuando una hebra
termina la funcion que tiene que ejecutar?



¿Por qué no pones directamente una llamada a la función que quieras al
final de la función que ejecuta lo que has lanzado en otra hebra? Si no
puedes modificar esa función, crea una función nueva que llame a la
función original y seguidamente llame a la función que tú quieras, y lanza
esta nueva función en una hebra en lugar de la función que originalmente
llamabas. Por supuesto que en lugar de una función puedes poner un evento
si lo prefieres.

Otra alternativa es usar el patrón de programación asíncrona de .Net
para lanzar tu hebra por mediación de un delegado. Si usas el BeginInvoke
para iniciar la ejecución, uno de los argumentos es precisamente un
delegado para hacerte la retrollamada cuando termine el proceso, con lo
que ya te da resuelta la llamada final.


Respuesta Responder a este mensaje
#3 Alberto Poblacion
28/05/2008 - 17:41 | Informe spam
"[Juanjo]" wrote in message
news:
El problema que tengo exactamente, es que desde el hilo principal creo una
hebra que lee un fichero con
datos, lo guardo en la base de datos, y muestro los datos en un datagrid
(desde esta hebra actualizo una
barra de progreso para indicar el estado del proceso).

Lo que ocurre es que el hilo principal termina antes de que termina la
hebra, por lo que no muestra los datos.

Si hago:
Thread hebra= new Thread(..);
hebra.start();
hebra.Join();
entonces no me actualiza la barra de progreso porque el hilo principal
espera a la hebra,



Si es un programa Windows, el hilo principal no termina hasta que
cierras el programa. Mientrras esté la pantalla abierta, el hilo principal
está "moviendo" la bomba de mensajes de Windows, y el otro hilo sigue
funcionando. Así que no puede ser correcto lo que dices de que "el hilo
principal termina antes de que termina la hebra".
Eso sí: recuerda que la interfaz visual de los programas Windows no está
preparada para funcionamiento en multihilo y no es legal actualizar nada en
pantalla (tal como una barra de progreso) desde otro hilo que no sea el
principal. Si desde el hilo de background quieres mostrar algo en pantalla,
es forzoso transportar la ejecución hasta el hilo principal y que sea éste
el que pinte la pantalla. Para eso está el método Invoke del formulario (o
de cualquier otro control), que sirve precisamente para transportar
("marshall") la ejecución desde otro hilo.

Lo que me gustaria es que no hiciera nada el programa (solo actualizar la
barra de progreso) mientras
se produce la carga de los datos.



No es necesario que hagas nada para esto. Por ejemplo, si desde el Click
de un botón lanzas el otro thread (que se pone a cargar datos) y símplemente
terminas la rutina de tratamiento del Click, el programa se queda "sin hacer
nada" (pero el hilo principal continúa atendiendo la bomba de mensajes),
mientras que continúa la ejecución del otro hilo en segundo plano. Cuando
este hilo quiere "tocar" algo de la pantalla, usa el Invoke para enviar un
mensaje a la ventana, el hilo principal lo detecta, y ejecuta la rutina que
hayas indicado dentro del Invoke. Esta rutina rueda dentro del hilo
principal, y puede pintar en pantalla lo que le hayas enviado como argumento
desde el otro hilo.
Respuesta Responder a este mensaje
#4 [Juanjo]
28/05/2008 - 18:29 | Informe spam
Gracias por las aclaraciones.

Me he explicado mal, cuando me refiero a que el hilo principal termina no
queria decir "cerrar la aplicacion o
formulario". Lo que ocurre es que mientras el hilo que carga los datos esta
"trabajando" el usuario puedo seguir
tocando los botones, listas, datagrid, etc, del formulario que es lo que
quiero evitar, es decir, que mientras
se cargan los datos, no se pueda tocar nada del programa, el unico control
que debe funcionar es la barra de
progreso.

Lo de la barra de progreso lo hago como tu indicas con el Invoke, ya sabia
que no podia "accede" a un
control desde un proceso que no lo ha creado.
Respuesta Responder a este mensaje
#5 Alberto Poblacion
28/05/2008 - 19:14 | Informe spam
"[Juanjo]" wrote in message
news:
Me he explicado mal, cuando me refiero a que el hilo principal termina no
queria decir "cerrar la aplicacion o
formulario". Lo que ocurre es que mientras el hilo que carga los datos
esta "trabajando" el usuario puedo seguir
tocando los botones, listas, datagrid, etc, del formulario que es lo que
quiero evitar, es decir, que mientras
se cargan los datos, no se pueda tocar nada del programa, el unico control
que debe funcionar es la barra de
progreso.

Lo de la barra de progreso lo hago como tu indicas con el Invoke, ya sabia
que no podia "accede" a un
control desde un proceso que no lo ha creado.



Podrías poner ".Enabled=false" en todos los controles del formulario
cuando lances el proceso de background, y cuando éste termine (puedes poner
una llamada de función al final de la rutina que lo ejecuta) volver a poner
true en el .Enabled.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida