¿Que es un hilo (Thread)?
Un hilo es un proceso paralelo a el entorno de ejecución de una aplicación.
Un ejemplo por asi decirlo es el propio entorno de windows, el cual windows es la aplicación y los programas que ejecutamos son los hilos que dependen de el.
-Empezando con los hilos
¿Que debemos saber? Importante!!
El hilo forma parte de la aplicación y esta viculada a ella , pero en determinadas ocasiones, a finalizar la aplicación si no hemos terminado el hilo, este seguirá corriendo, y nos ocupará espacio en memoria hasta que finalice o bien lo terminemos nosotros desde el administrador de tareas.
Para entender un poco el funcionamiento vamos a crear una sencilla aplicacion la cual utilizará 1 hilo para cambiar el color en un panel .
Creamos 1 form ,3 Botones ,1 Panel.
Nuestro Boton1 sera iniciar, el boton2 detener, y el boton3 nos mostrará el estado del hilo.
Antes de empzar con la programación del hilo debemos agregar al load la siguiente linea.
1 2 3 |
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.CheckForIllegalCrossThreadCalls = False End Sub |
Esto permitirá a el hilo que pueda interactuar con la aplicación quitando la restricción, de que el hilo como hijo pueda acceder y modificar propiedades de el elemento padre (el form) o cualquier control.
-Declaración del hilo
1 2 |
Public Class Form1 Dim th As New Threading.Thread(AddressOf CambioColor) |
Creamos la variable th llamando contructor y asignandole la función con la que va a operar el hilo.
-aqui la función en bucle.
1 2 3 4 5 6 7 8 9 |
Dim Salir As Boolean Public Function CambioColor() Dim c As New Color Dim A As New Random Dim R As New Random Do Until Salir Me.Panel1.BackColor = c.FromArgb(A.Next(1, 255), R.Next(1, 255), A.Next(1, 255), R.Next(1, 255)) Loop End Function |
En el boton1 le llamaremos Start y escribimos lo siguente.
1 2 3 4 5 6 7 |
If th.ThreadState = Threading.ThreadState.Unstarted Or th.ThreadState = Threading.ThreadState.Aborted Then th = New Threading.Thread(AddressOf CambioColor) Salir = False th.Start() Else MsgBox("El hilo esta corriendo") End If |
Con ello controlaremos que no se esta ejecutando y si lo esta mostramos el mensaje.
Ahora vamos con el boton2 , lo llamaremos Stop y escribimos es siguiente codigo.
1 2 3 4 5 6 7 |
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If th.ThreadState = Threading.ThreadState.Running Then Salir = True 'Indicamos salir para finalizar el bucle th.Abort() ' y Abortamos el hilo End If End Sub |
Y en el boton3, lo llamamos ver estado y escribimos el siguiente codigo para que nos muestre mientras se está ejecutando o no el estado del hilo.
1 2 3 |
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click MsgBox(th.ThreadState.ToString) End Sub |
.Este es un ejemplo sencillo de hilo, los hilos tienen multiples estados, se pueden pausar, reanudar….
y son bastante utiles si necesitamos hacer operaciónes que no deben influir en la experiencia del usuario.
dejo aqui el codigo comentado del ejemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Public Class Form1 'Declaracion del hilo Dim th As New Threading.Thread(AddressOf CambioColor) Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing th = Nothing 'Vacia el hilo. GC.Collect() 'llamada al garbage collection para vaciar la memoria End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'desactivamos la restriccion a los hilos Me.CheckForIllegalCrossThreadCalls = False End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Controlamos los estados If th.ThreadState = Threading.ThreadState.Unstarted Or th.ThreadState = Threading.ThreadState.Aborted Or th.ThreadState = Threading.ThreadState.Stopped Then th = New Threading.Thread(AddressOf CambioColor) Salir = False 'indica False para que el bucle pueda seguir th.Start() 'Inicia el hilo Else MsgBox("El hilo esta corriendo") End If End Sub Dim Salir As Boolean 'True sale del bucle, false sigue Public Function CambioColor() Dim c As New Color Dim A As New Random Dim R As New Random Do Until Salir 'Bucle Me.Panel1.BackColor = c.FromArgb(A.Next(1, 255), R.Next(1, 255), A.Next(1, 255), R.Next(1, 255)) Loop End Function Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If th.ThreadState = Threading.ThreadState.Running Then Salir = True 'Indicamos salir para finalizar el bucle th.Abort() ' y Abortamos el hilo Else MsgBox("El hilo esta parado") End If End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Me.Label1.Text = th.ThreadState.ToString 'asigna al label el estado del hilo End Sub End Class |
ya sabes, si te gusta unete a nuestro foro , comenta y compartelo.