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.
Parts
» Visual branding biro perjalanan alam (1)
» El manifiesto del ensamblado
» Instalación de Visual Studio .NET
» Grabando texto en un fichero
» Principales elementos en nuestro entorno de trabajo
» Manejo de ventanas adicionales del IDE
» Conceptos mínimos sobre depuración
» Comparación de cadenas en base a un patrón. El operador Like
» Uso de paréntesis para mejorar la legibilidad de expresiones
» Sintaxis de un procedimiento Function
» Sobrecarga de procedimientos
» Abordando un problema mediante programación procedural
» Creación de propiedades para la clase
» Encapsulación a través de propiedades
» Creación de métodos para la clase
» Sobrecarga de métodos o polimorfismo, en una misma clase
» Espacios de nombres (namespaces)
» Acceso a espacios de nombre de otros ensamblados
» Herencia y sobre-escritura de métodos
» Diferencias entre sobrecarga y sobre-escritura en base al tipo de enlace
» Ocultamiento de miembros de una clase
» Comportamiento de las palabras clave Me, MyClass y MyBase ante la sobre-escritura de métodos
» Herencia y métodos constructores
» Clases abstractas o no instanciables
» Comprobación del tipo de un objeto y moldeado (casting)
» Destrucción de objetos y recolección de basura
» Creación y manipulación de estructuras
» Estructuras o clases, ¿cuál debemos utilizar?
» Manipulación de cadenas con la clase String
» Optimizando la manipulación de cadenas con la clase StringBuilder
» Extender las funcionalidades de una clase a través de delegados
» La clase EventArgs, o cómo obtener información del objeto emisor del evento
» Obtención de subarrays a partir de un objeto ArrayList
» Manejo básico de colecciones Hashtable
» Operaciones varias con colecciones Hashtable
» Manipulación de valores en una colección Queue
» Implementando un interfaz para crear una nueva colección
» Manipulación estructurada de errores
» La influencia del orden de los manipuladores de excepciones
» Creación de excepciones personalizadas
» Manipulación de archivos mediante File y FileInfo
» Manipulación de archivos mediante Directory y DirectoryInfo
» Monitorización del sistema de archivos con FileSystemWatcher
» Creación de un formulario básico
» Iniciar el formulario desde Main( )
» Codificación de los eventos de controles
» Selección de texto en un TextBox
» Compartiendo código entre controles
» Crear una clase derivada de un control
» Agregar un proyecto con un formulario derivado
» Crear un formulario heredado desde un proyecto independiente
» Creación de menús desde código
» Detectando el estado de finalización
» Crear un proceso de monitorización
» Comportamiento Modal de formularios
» Formularios dependientes y fijos en primer plano
» Dibujo con las clases Graphics y Pen
» Manipulación de los eventos de pintado en la clase Form
» Manipulando el grado de opacidad del formulario
» Integrando elementos. Un visualizador de gráficos
» Comparativa de ADO /ADO .NET
» Arquitectura de datos desconectados
» Una visión general de ADO .NET
» Espacios de nombres y clases en ADO .NET
» Empleo de Data Binding simple para navegar y editar datos
» Configurar por código las propiedades del DataGrid
Show more