Información adicional: Control.Invoke se debe utilizar para interactuar con controles creados en un subproceso independiente.|
0 comentarios Publicado por Julio en 9:51Este 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:
- 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
Public Class formulario
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
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"})
New Object() {"Nueva cadena del Label"} se utiliza para entregar los parametros correspondientes.
Finalmente el código total es el siguiente:
- 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
Public Class formulario
End Class
Etiquetas: delegado, error, hilo, Invoke, visual basic
Entradas más recientes Entradas antiguas Inicio
Suscribirse a:
Entradas (Atom)