Detectando el estado de finalización

Detectando el estado de finalización

Una vez lanzada la ejecución de una hebra, podemos emplear el método Join( ) para averiguar su estado de finalización.

Si queremos esperar un tiempo antes de comprobar dicho estado, pasaremos como parámetro a este método, el tiempo a esperar en milisegundos.

Esto es lo que haremos en el proyecto HebraFinaliz (hacer clic aquí para acceder a este ejemplo), donde también ejecutaremos el proceso de llenado de un ListBox. Ver Código fuente 490.

Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click

Dim Contador As Integer Dim Hebra As Thread

Me.lstValores.Items.Clear()

Hebra = New Thread(AddressOf AgregarConRetardo) Hebra.Start()

' si la hebra no se ha terminado, el método Join() ' devuelve False; pero si ha terminado devuelve True If Hebra.Join(1000) Then

Me.lblMensaje.Text = "Hebra finalizada" Else Me.lblMensaje.Text = "Hebra NO finalizada" End If

End Sub

'procedimiento que se ejecutará dentro de una hebra

Programación con Visual Basic .NET © Grupo EIDOS

' especificando un retardo en el bucle del procedimiento Private Sub AgregarConRetardo()

Dim Contador As Integer

Me.lstValores.Items.Add("Sub AgregarConRetardo - ejecutandose en hebra " & AppDomain.GetCurrentThreadId().ToString())

For Contador = 1 To 20 Me.lstValores.Items.Add(" hebra " & AppDomain.GetCurrentThreadId().ToString() & " paso " & Contador.ToString()) Thread.CurrentThread.Sleep(250) Next

End Sub

Código fuente 490

Veamos el formulario de este proyecto en la Figura 287.

Figura 287. Comprobando la finalización de la hebra.

Ejecución paralela de procesos a distintos ritmos

En el ejemplo HebrasRitmos (hacer clic aquí para acceder a este ejemplo) vamos a llenar dos controles

de lista al mismo tiempo con sendas hebras. El aspecto a destacar en este caso, es que los procedimientos a ejecutar en cada hebra, serán ejecutados a distinto ritmos a través de retardos mediante el método Sleep( ), de modo que el procedimiento que debe llenar menos elementos, y que en principio debería terminar antes, será el que termine el último. Ver Código fuente 491.

Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click

Dim Contador As Integer

© Grupo EIDOS 32. Programación con hebras

Dim Hebra As Thread Dim HebraBis As Thread

Me.lstValores.Items.Clear() Me.lstDatos.Items.Clear()

Hebra = New Thread(AddressOf LlenaListaValores) Hebra.Start()

HebraBis = New Thread(AddressOf LlenaListaDatos) HebraBis.Start()

End Sub

' este procedimiento se ejecutará en una hebra ' y llenará un ListBox Private Sub LlenaListaValores()

Dim Contador As Integer Me.lstValores.Items.Add("Sub LlenaListaValores - ejecutandose en hebra " &

AppDomain.GetCurrentThreadId().ToString())

For Contador = 1 To 30 Me.lstValores.Items.Add(" hebra " & AppDomain.GetCurrentThreadId().ToString() & " paso " & Contador.ToString()) Thread.CurrentThread.Sleep(500) Next End Sub

' este procedimiento se ejecutará en una hebra ' y llenará el otro ListBox Private Sub LlenaListaDatos()

Dim Contador As Integer

Me.lstDatos.Items.Add("Sub LlenaListaDatos - ejecutandose en hebra " & AppDomain.GetCurrentThreadId().ToString())

For Contador = 1 To 50 Me.lstDatos.Items.Add(" hebra " & AppDomain.GetCurrentThreadId().ToString() & " paso " & Contador.ToString()) Thread.CurrentThread.Sleep(150) Next End Sub

Código fuente 491.

La Figura 288 muestra un instante de la ejecución de este programa de ejemplo.

Figura 288. Ejecución de dos hebras a distinto ritmo.

Programación con Visual Basic .NET © Grupo EIDOS