Este error me ocurrió al intentar acceder a los controles internos de un formulario, por ejemplo un Label, desde un hilo creado por medio de la clase Thread.

A traves de este formulario:


El código del evento del botón al ser presionado es el siguiente:


Public Class formulario
Sub MetodoHilo(ByVal value As String)
Me.Label1.Text = value
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hilo1 As Threading.Thread = New Threading.Thread(AddressOf Me.MetodoHilo)
hilo1.Start()
End Sub
End Class


Cuando el programa intenta ejecutar la línea Me.Label1.Text = "i" ocurre el error y se recomienda la Información adicional que se encuentra en el título.

La solución:

Inicialmente se debe crear una funcion diferente a la del hilo donde se modifique cualquier variable interna del formulario por ejemplo:

Sub cambiandoLabel(ByVal value As String)
Me.Label1.Text = value
End Sub

En este caso la función cambiandoLabel cambia el texto de Label1

Ahora es necesario declarar un delegado, el cual siendo una referencia a una función permitirá que dentro del hilo se ejecute la función cambiandoLabel.

Public Delegate Sub cambiandoLabeldelegate(ByVal value As String)

El delegado debe contener los parametros similares a la funciona la que apunta.

La siguiente línea permite crear entonces un apuntador hacia la función cambiandoLabel por medio del delegado

Public cambio As New cambiandoLabeldelegate(AddressOf cambiandoLabel)

Ahora se usa el metodo invoke que recbe como parametro el delegado instanciado. Este metodo se usará dentro de la funcion que ejecuta el hilo en este caso metodoHilo

Sub MetodoHilo()
Me.Invoke(Me.cambio, New Object() {"Nueva cadena del Label"})
End Sub

New Object() {"Nueva cadena del Label"} se utiliza para entregar los parametros correspondientes.


Finalmente el código total es el siguiente:


Public Class formulario
Dim t As String

Public Delegate Sub cambiandoLabeldelegate(ByVal value As String)

Private cambio As New cambiandoLabeldelegate(AddressOf cambiandoLabel)

Sub cambiandoLabel(ByVal value As String)

Me.Label1.Text = value

End Sub

Sub MetodoHilo()

Me.Invoke(Me.cambio, New Object() {"Nuevo cadena del Label"})

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim hilo1 As Threading.Thread = New Threading.Thread(AddressOf Me.MetodoHilo)

hilo1.Start()

End Sub

End Class

0 Comments:

Post a Comment



Entrada antigua Página principal

Blogger Template by Blogcrowds