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
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