Sincronización de hebras

Sincronización de hebras

En un ejemplo anterior, en el cual, varias hebras llamaban a su vez a múltiples procedimientos, es posible como se comentaba al final de dicho apartado, que el resultado obtenido mostrara la ejecución mezclada de varias hebras. El motivo es que todas las hebras creadas trabajaban contra el mismo objeto: el control ListBox del formulario, interfiriéndose mutuamente en algunas ocasiones.

Para evitar este problema, .NET nos proporciona la estructura SyncLock, que nos permite bloquear un objeto que se esté ejecutando dentro del proceso de una hebra, de forma que hasta que dicha hebra no haya finalizado de usar el objeto, no se desbloqueará para ser utilizado por otra hebra, o lo que es igual, SyncLock permite que un objeto sólo pueda ser utilizado por una hebra a la vez.

Para demostrar el uso de SyncLock, crearemos una nueva aplicación con el nombre HebraSincro (hacer clic aquí para acceder a este ejemplo), incluyendo un control Button y un ListBox en su formulario.

Al pulsar el botón de este formulario, crearemos dos hebras que ejecutarán un procedimiento diferente cada una. El procedimiento rellenará de valores el ListBox, con una diferencia respecto a los anteriores ejemplos, consistente en que cuando una de las hebras ejecute su procedimiento, bloqueará el ListBox y hasta que no termine de rellenarlo, no cederá el objeto a la siguiente hebra. Veamos estas operaciones en el Código fuente 492.

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

' crear dos hebras y lanzarlas Dim HebraUno As New Thread(AddressOf ManipListaUno) Dim HebraDos As New Thread(AddressOf ManipListaDos) HebraUno.Start() HebraDos.Start()

End Sub

'procedimiento que será ejecutado en una de las hebras Private Sub ManipListaUno()

Dim Contador As Integer ' si hay hebras que utilizan objetos comunes, ' (en este caso el listbox) ' es necesario sincronizar el objeto de forma ' que sólo pueda ser utilizado por una hebra a la vez SyncLock (Me.lstValores)

For Contador = 1 To 100 Me.lstValores.Items.Add("Sub ManipListaUno - paso: " & Contador) Next End SyncLock End Sub ' procedimiento que será ejecutado en una de las hebras Private Sub ManipListaDos()

Dim Contador As Integer ' sincronizar también en este procedimiento ' el listbox SyncLock (Me.lstValores)

For Contador = 1 To 100 Me.lstValores.Items.Add("Sub ManipListaDos - paso: " & Contador) Next End SyncLock End Sub

Código fuente 492

© Grupo EIDOS 32. Programación con hebras

En esta ocasión, no aparecerán en el ListBox, valores entremezclados producto de los intentos de las hebras de acaparar el uso del control del formulario, por el contrario, aparecerán en primer lugar los valores de la ejecución de la primera hebra, y a continuación los de la segunda.

Debido a que el código se ejecuta a gran velocidad, para comprobar mejor este efecto, puede ser buena idea introducir un retardo en cada procedimiento que ejecutan las hebras, de manera que podamos observar con más detenimiento el proceso.