Matemáticas Discretas
Hola, espero esten bien, este parece ser mi primer post.
Desde hace mucho tiempo he buscado como manejar hilos en VB.NET y hay un numero
importante de ejemplos pero al llevarlos a la practica, ninguno da resultados, para que
decirle los que aparecen en la ayuda de MSN.
Quizas algunos ya saben que el manejo de hilos en si no es complicado, elproblema se crea
cuando quieres actualizar componenetes graficos, ya que estos deben ser llamados de una
manera muy particular, mediante el comando INVOKE y por medio de procesos delegados,
para impedir que hilos diferentes o el usuario modifiquen el componente grafico, ya sea un
TextBox, ListBox, etc. esto me recordo cuando programaba en Clipper y habia que
bloquear las bases de datos cuando sequeria modificar o ingresar algun registro.
Sin mas palabras he aqui el ejemplo.
Código:
1.
2.
3.
4.
5.
6.
7.
' 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
8.
9.
10.
Private Sub Form1_Load(ByVal sender AsSystem.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
11.
t = New Thread(AddressOf
Me.ProcesodeFondo) 'creamos el hilo con nombre "t"
12.
TextBox1.Text = t.ThreadState 'para saber
en que estado esta el hilo
13.
End Sub
14.
15.
Private Sub ProcesodeFondo() 'este seria la
funcion que maneja el subproceso
16.
17.
Dim i As Integer = 1
18.
19.
Do While True
20.Add_Datos_ListBox(i) 'aqui se llamada
a la funcion que maneja el listbox
21.
i += 1
22.
Thread.Sleep(100) 'tiempo de espera
del hilo(una pequeña pausa)
23.
Loop
24.
25.
End Sub
26.
27.
Private Sub Add_Datos_ListBox(ByVal
[valor] As Integer)
28.
If ListBox1.InvokeRequired Then 'Aqui
vemos por quien ha sido invocado el listbox
29.
'en caso que este en conflicto toma elidentificador del hilo
30.
'y pasa el valor que envia al listbox
31.
Dim d As New Set_ListBox(AddressOf
Add_Datos_ListBox)
32.
Invoke(d, New Object()
{[valor]})
33.
Else
34.
'en caso que sea invocado por un solo
hilo agrega el valor correspondiente.
35.
ListBox1.Items.Add([valor])
36.
End If
37.
End Sub
38.
39.
'De aqui empieza el juego con los botones y
los estadosdel hilo
40.
'un hilo no puede ser parado si no se ha
iniciado
41.
'un hilo no puede ser pausado si no se ha
iniciado
42.
'un hilo no puede ser reiniciado despues de
haber sido parado
43.
'con parado me refiero al comando abort() que
detiene el hilo definitivamente
44.
'un hilo puede dormir(Sleep),
Suspenderse(Suspend) y reiniciarse.
45.
Private Sub Button1_Click(ByVal sender AsSystem.Object, ByVal e As System.EventArgs) Handles
Button1.Click
46.
If t.ThreadState ThreadState.Unstarted
And t.ThreadState ThreadState.Stopped Then
47.
t.Suspend()
48.
49.
50.
51.
End If
End Sub
Private Sub Button2_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Button2.Click
52.
If t.ThreadState = ThreadState.Suspended
Then
53.
t.Resume()54.
ElseIf t.ThreadState = ThreadState.Stopped
Then
55.
MsgBox("Imposible reiniciar un Hilo
despues de abortado", MsgBoxStyle.Critical)
56.
Else
57.
t.Start()
58.
End If
59.
End Sub
60.
61.
Private Sub Button3_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Button3.Click
62.
If t.ThreadState = ThreadState.Suspended
Then
63.
t.Resume()
64.t.Abort()
65.
ElseIf t.ThreadState =
ThreadState.WaitSleepJoin Then
66.
t.Abort()
67.
Else
68.
MsgBox("No se puede detener un hilo
que no se ha iniciado", MsgBoxStyle.Critical)
69.
End If
70.
71.
End Sub
72.
73.
Private Sub Button4_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Button4.Click
74.
TextBox1.Text = t.ThreadState
75.
End Sub
76.
End Class...
Regístrate para leer el documento completo.