' importaciones importantes
Imports System
Imports System.Threading
Public Class Form1
Dim t As Thread 'declaracion del hilo
Delegate Sub Set_ListBox(ByVal [valor] As Integer) 'declaracion del Delegado
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
t = New Thread(AddressOf Me.ProcesodeFondo) 'creamos el hilo con nombre "t"
TextBox1.Text = t.ThreadState 'para saber en que estado esta el hilo
End Sub
Private Sub ProcesodeFondo() 'este seria la funcion que maneja el subproceso
Dim i As Integer = 1
Do While True
Add_Datos_ListBox(i) 'aqui se llamada a la funcion que maneja el listbox
i += 1
Thread.Sleep(100) 'tiempo de espera del hilo(una pequeña pausa)
Loop
End Sub
Private Sub Add_Datos_ListBox(ByVal [valor] As Integer)
If ListBox1.InvokeRequired Then 'Aqui vemos por quien ha sido invocado el listbox
'en caso que este en conflicto toma el identificador del hilo
'y pasa el valor que envia al listbox
Dim d As New Set_ListBox(AddressOf Add_Datos_ListBox)
Invoke(d, New Object() {[valor]})
Else
'en caso que sea invocado por un solo hilo agrega el valor correspondiente.
ListBox1.Items.Add([valor])
End If
End Sub
'De aqui empieza el juego con los botones y los estados del hilo
'un hilo no puede ser parado si no se ha iniciado
'un hilo no puede ser pausado si no se ha iniciado
'un hilo no puede ser reiniciado despues de haber sido parado
'con parado me refiero al comando abort() que detiene el hilo definitivamente
'un hilo puede dormir(Sleep), Suspenderse(Suspend) y reiniciarse.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If t.ThreadState <> ThreadState.Unstarted And t.ThreadState <> ThreadState.Stopped Then
t.Suspend()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If t.ThreadState = ThreadState.Suspended Then
t.Resume()
ElseIf t.ThreadState = ThreadState.Stopped Then
MsgBox("Imposible reiniciar un Hilo despues de abortado", MsgBoxStyle.Critical)
Else
t.Start()
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If t.ThreadState = ThreadState.Suspended Then
t.Resume()
t.Abort()
ElseIf t.ThreadState = ThreadState.WaitSleepJoin Then
t.Abort()
Else
MsgBox("No se puede detener un hilo que no se ha iniciado", MsgBoxStyle.Critical)
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
TextBox1.Text = t.ThreadState
End Sub
End Class