lunes, 6 de febrero de 2012

Haz tu aplicacion sea multitarea (Threading.thread)

Buenas a tod@s:

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 Sub
Si 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 Sub
Ahora 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 Class
NOS HEMOS CAMBIADO ESTAMOS EN SOULSMAKERS.COM CON MUCHISIMOS CONTENIDOS VIDEOS Y EJEMPLOS