Hilos que acceden a controles

22/04/2005 - 19:56 por Gustavo Alegre | Informe spam
Hola a todos:

Estoy intentando crear una aplicación con multihilos, por ejemplo, este código accede desde 2 hilos a los controles Label1 y Label2 respectivamente para cambiar su propiedad Text:

Imports System.Threading

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim HiloTarea1 As New Thread(AddressOf Me.Tarea1)
Dim HiloTarea2 As New Thread(AddressOf Me.Tarea2)
HiloTarea1.Start()
HiloTarea2.Start()
End Sub

Private Sub Tarea1()
Dim i As Integer
For i = 1 To 5000
Label1.Text = i.ToString
Application.DoEvents()
Next i
End Sub

Private Sub Tarea2()
Dim i As Integer
For i = 1 To 5000
Label2.Text = i.ToString
Application.DoEvents()
Next i
End Sub

End Class

Sin embargo en las funciones de los hilos, aparece un error System.InvalidOperationException que muestra el siguiente mensaje:

"Cross-thread operation not valid: Control 'Label2' accessed from a thread other than the thread it was created on."

...y cancela la ejecución. ¿Algo está mal en el código? ¿Existe una forma correcta para cambiar propiedades en los controles desde hilos?

Estoy utilizando la Beta 2 de Visual Basic 2005.

Gracias de antemano.


Saludos.
Gustavo Alegre
 

Leer las respuestas

#1 floyd303
23/04/2005 - 13:16 | Informe spam
Hola!

Lo que pasa es que cuando se lanza un formulario, tanto él mismo, como
sus controles funcionan dentro del mismo hilo de ejecucion. Por tanto
no pueden ser actualizados directamente desde otro hilo diferente.
Una manera de actualizar estos controles desde otro hilo es utilizando
el metodo Invoke de la clase Control. Tu codigo pasaria a ser de la
siguiente manera:


Imports System.Threading

Public Class Form1
Inherits System.Windows.Forms.Form



Dim m_iValor1 As Integer
Dim m_iValor2 As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Dim HiloTarea1 As New Thread(AddressOf Me.Tarea1)
Dim HiloTarea2 As New Thread(AddressOf Me.Tarea2)
HiloTarea1.Start()
HiloTarea2.Start()
End Sub


Private Sub Tarea1()
For m_iValor1 = 1 To 5000
Label1.Invoke(New EventHandler(AddressOf
ActualizarLabel1))
Next
End Sub

Private Sub Tarea2()
For m_iValor2 = 1 To 5000
Label2.Invoke(New EventHandler(AddressOf
ActualizarLabel2))
Next
End Sub

Protected Sub ActualizarLabel1(ByVal sender As Object, ByVal e As
EventArgs)
Label1.Text = m_iValor1
End Sub
Protected Sub ActualizarLabel2(ByVal sender As Object, ByVal e As
EventArgs)
Label2.Text = m_iValor2
End Sub


End Class

Espero que te sirva de ayuda... ah! una ultima cosa, la actualizacion
de los controles es una de las prioridades mas bajas que otorga
Windows, por eso veras que no se actualizan los labels de una manera
uniforme. Eso no quiere decir que no se esten actualizando bien los
contadores, es simplemente la actualizacion de los labels la que se
retrasa! Puedes intentar poner un DoEvents detras del Invoke, para
asegurarte que se llama a dicho invoke antes de pasar a la siguiente
actualizacion. A mi personalmente esto no me gusta nada (odio el
DoEvents!!)

Un saludo
Roberto M. Oliva


"Gustavo Alegre" wrote in message news:...
Hola a todos:

Estoy intentando crear una aplicación con multihilos, por ejemplo, > este código accede desde 2 hilos a los controles Label1 y Label2 > respectivamente para cambiar su propiedad Text:

Imports System.Threading

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As > System.EventArgs) Handles Button1.Click
Dim HiloTarea1 As New Thread(AddressOf Me.Tarea1)
Dim HiloTarea2 As New Thread(AddressOf Me.Tarea2)
HiloTarea1.Start()
HiloTarea2.Start()
End Sub

Private Sub Tarea1()
Dim i As Integer
For i = 1 To 5000
Label1.Text = i.ToString
Application.DoEvents()
Next i
End Sub

Private Sub Tarea2()
Dim i As Integer
For i = 1 To 5000
Label2.Text = i.ToString
Application.DoEvents()
Next i
End Sub

End Class

Sin embargo en las funciones de los hilos, aparece un error > System.InvalidOperationException que muestra el siguiente mensaje:

"Cross-thread operation not valid: Control 'Label2' accessed from a > thread other than the thread it was created on."

...y cancela la ejecución. ¿Algo está mal en el código? > ¿Existe una forma correcta para cambiar propiedades en los controles > desde hilos?

Estoy utilizando la Beta 2 de Visual Basic 2005.

Gracias de antemano.


Saludos.
Gustavo Alegre

Preguntas similares