Controlar la ejecución de threads.

07/07/2005 - 11:37 por carlos | Informe spam
Hola a todos, mi problema es el siguiente.
Tengo un modulo que carga una serie de datos con lo que la pantalla se queda
bloqueda hasta que termina la carga, la solución que encontre es lanzar un
hilo para evitar el bloqueo pero claro el problema llega que quiero saber
cuando el thread a terminado su ejecución.
Hay una propiedad IsAlive que indica si esta en ejecucion pero no me
resuelve el problema ya que para poder comprobar si esta vivo lo tengo que
introducir en un bloque de un evento.
hay algun delegado que notifique los cambios de estado de del hilo.
Grascias por todo.
Carlos.

Preguntas similare

Leer las respuestas

#1 A.Poblacion
07/07/2005 - 12:12 | Informe spam
"carlos" wrote in message
news:
Hola a todos, mi problema es el siguiente.
Tengo un modulo que carga una serie de datos con lo que la pantalla se


queda
bloqueda hasta que termina la carga, la solución que encontre es lanzar un
hilo para evitar el bloqueo pero claro el problema llega que quiero saber
cuando el thread a terminado su ejecución.
Hay una propiedad IsAlive que indica si esta en ejecucion pero no me
resuelve el problema ya que para poder comprobar si esta vivo lo tengo que
introducir en un bloque de un evento.
hay algun delegado que notifique los cambios de estado de del hilo.



Lo más sencillo es que crees una variable booleana y la inicialices a
false. En la rutina del thread, justo antes de terminar, pones a true la
variable. Y en el programa principal examinas la variable y cuando tenga un
true significa que el thread ha terminado.

Si quieres notificar la terminación de thread con un delegado, tienes que
declarar tú mismo el delegado, e invocarlo al final de la rutina del thread.

Si no quieres hacer lo anterior y quieres que el framework lo haga por
tí, entonces puedes usar la denominada "ejecución asíncrona" en lugar de
crear tú mismo el thread. Lo que se hace es meter en una subrutina el código
del thread (ya lo debes tener así porque sino no puedes crear el Thread),
crear un delegado que apunte a ella, y ejecutar el delegado con su método
BeginInvoke. Este método ya crea un thread separado y comienza a ejecutarlo,
y lleva un argumento para ponerle un callback, al cual te llama cuando
termine el hilo.
Respuesta Responder a este mensaje
#2 Tristan
07/07/2005 - 13:56 | Informe spam
En realidad normalmente no necesitas definir ningún evento. Basta con que
llames a un método desde el propio código del subproceso.

Ejemplo:

Dim subproceso As New Threading.Thread(AddressOf tarea)
subproceso.Start()

Sub tarea()
Dim i As Integer
For i = 1 To 5000
Me.Text = i.ToString() ' Se debería utilizar Invoke
Next
NotificaFin()
End Sub

Sub NotificaFin()
MsgBox("Subproceso finalizado")
End Sub

En todo caso podría ser útil crear un evento cuando crees una clase
envoltorio para tu subproceso (puede ser útil para pasar parámetros). En este
caso, basta con que crees un evento en tu clase y lo invoques cuando sea
necesario.

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#3 carlos
07/07/2005 - 17:58 | Informe spam
Gracias a los dos,
Me habeis sido de gran ayuda.
Un saludo.

"Tristan" escribió:

En realidad normalmente no necesitas definir ningún evento. Basta con que
llames a un método desde el propio código del subproceso.

Ejemplo:

Dim subproceso As New Threading.Thread(AddressOf tarea)
subproceso.Start()

Sub tarea()
Dim i As Integer
For i = 1 To 5000
Me.Text = i.ToString() ' Se debería utilizar Invoke
Next
NotificaFin()
End Sub

Sub NotificaFin()
MsgBox("Subproceso finalizado")
End Sub

En todo caso podría ser útil crear un evento cuando crees una clase
envoltorio para tu subproceso (puede ser útil para pasar parámetros). En este
caso, basta con que crees un evento en tu clase y lo invoques cuando sea
necesario.

Juan Carlos Badiola Saiz
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida