Vamos a utilizar Threading.thread para hacer que nuestra aplicacion sea multitarea.
Los threads son hilos de ejecucion, al igual el sistema operativo lanza subprocesos para mantener activas las aplicaciones.
El ejemplo que vamos a ver es cambiar un panel de color mientras que con un control sencillo vamos insertando numeros en un listbox.
Os dejo un print del formulario de ejemplo.
Primero hay que empezar por desbloquear las llamadas a los controles en las operaciones. Para evitar que den error cuando interactuan con los controles del formulario.
En el load añadimos esto.
Private Sub Hilos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.CheckForIllegalCrossThreadCalls = False End Sub
Como vamos a trabajar con un hilo, que podemos iniciarlo y pararlo en este ejemplo lo que vamos a hacer es eliminarlo y volverlo a crear. para ello declaramos de forma global un hilo pero sin inicializarlo.
Public thColor As Threading.Thread
Bien ahora nos vamos a crear la funcio que se encargara de cambiar el panel de color, tenemos que tener en cuenta que deberemos controlar el estado del hilo. Bien para ello creamos una funcion CambioColor() a la que aplicaremos esto, y ademas controlaremos con un try la llamada al estado del hilo por que aun no esta inicializado.
Private Sub CambioColor() Do Try If thColor.ThreadState = Threading.ThreadState.Aborted Or thColor.ThreadState = Threading.ThreadState.AbortRequested Then Exit Do End If Me.Panel1.BackColor = New Color().FromArgb(New Random().Next(1, 255), New Random().Next(1, 255), New Random().Next(1, 255), New Random().Next(1, 255)) Catch End Try Loop thColor = Nothing End SubSi no hubieramos quitado las restricciones a los controles nos daria error cuando hace el me.panel1.backcolor = .... .
Ahora vamos a crear la llamada del hilo en el boton iniciar, para que ponga en marcha este hilo. igual controlamos el estado del hilo por si ya esta corriendo.
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click thColor = New Threading.Thread(AddressOf CambioColor) If thColor.ThreadState <> Threading.ThreadState.Running Then thColor.Start() End If End SubAhora solo queda el boton detener. El cual se va a encargar de abortar el hilo y como controlamos el estado en la funcion cambiocolor este saldra del bucle.
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click thColor.Abort() End Sub
Como veis el codigo es muy sencillito. para añadir items al listbox os lo dejo con todo el codigo pero antes un pantallazo en ejecucion
Aqui el codigo completo.
Public Class Hilos Public thColor As Threading.Thread Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click thColor = New Threading.Thread(AddressOf CambioColor) If thColor.ThreadState <> Threading.ThreadState.Running Then thColor.Start() End If End Sub Private Sub CambioColor() Do Try If thColor.ThreadState = Threading.ThreadState.Aborted Or thColor.ThreadState = Threading.ThreadState.AbortRequested Then Exit Do End If Me.Panel1.BackColor = New Color().FromArgb(New Random().Next(1, 255), New Random().Next(1, 255), New Random().Next(1, 255), New Random().Next(1, 255)) Catch End Try Loop thColor = Nothing End Sub Private Sub Hilos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.CheckForIllegalCrossThreadCalls = False End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click thColor.Abort() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.ListBox1.Items.Add(Me.TextBox1.Text + 1) Me.TextBox1.Text = Me.TextBox1.Text + 1 End Sub End ClassNOS HEMOS CAMBIADO ESTAMOS EN SOULSMAKERS.COM CON MUCHISIMOS CONTENIDOS VIDEOS Y EJEMPLOS
excelente muchÃsimas gracias.
ResponderEliminarmuy buen aporte
ResponderEliminar... interesante. Estoy trabajando en programa que en un PictureBox visualiza, sin interrupción, la imagen captada por una cámara IP. Por otro lado está a la "escucha" de peticiones para grabar instantaneas (tcpListener). He creado creado un hilo para la ejecución del listener y un timer que comprueba la existencia de solicitudes de conexión pendientes cada x milisegundos. Problema: La imagen tiene un retardo brutal. Si paro el listener funciona correctamente. ¿Alguna idea?
ResponderEliminarBuen aporte. Me ha gustado