Visual Basic.NET - Hilos en vb2008 Framework 3.5

   
Vista:

Hilos en vb2008 Framework 3.5

Publicado por marce  (17 intervenciones) el 07/04/2009 19:35:01
Imports System.Threading
Public Class Form1

Inherits System.Windows.Forms.Form
Private oHebra As Thread

Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnIniciar.Click

' instanciar la hebra y ponerla en marcha en el constructor de la hebra,
' indicamos qué procedimiento deberá ejecutar al ser iniciada
oHebra = New Thread(AddressOf LlenarLista)
oHebra.Start()

End Sub

Private Sub LlenarLista()
Dim iContador As Integer
Dim iCuentaBis As Integer

For iContador = 1 To 10000

Me.lstProceso.Items.Add("Contador: " & iContador) <--- Aquí no funciona en el vb 2008 *

For iCuentaBis = 1 To 50000
' retardo
Next
Next

' finalizamos la hebra
oHebra.Abort()
End Sub

En vbasic 2008 cuando trato de llamar desde una hebra a cualquier elemento del formulario
sea boton texbox label etc no me deja.

.... Entoces como se soluciona esto ? ? ?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:Hilos en vb2008 Framework 3.5

Publicado por roger (186 intervenciones) el 08/04/2009 00:46:33
que yo sepa, en ninguna version se puede, un hilo secundario no puede acceder a los controles de la interfaz de usuario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Hilos en vb2008 Framework 3.5

Publicado por JoanF (129 intervenciones) el 08/04/2009 04:27:26
Hola,

El problema se debe a que el NET Framework no permite desde una hebra acceder directamente a objetos ejecutándose en otra hebra.

Para solventar ese problema en Windows Forms los controles tienen las funciones Invoke (sincronamente) y BeginInvoke (asincronamente) para llamar a funciones o métodos en la hebra en la que se esta ejecutando el control.

El código del método LlenarLista quedaría de la forma:

'Delegado que "apuntara" a la función o método que llamara la función invoke
Private Delegate Sub AddItemDelegate(ByVal TextoItem As String)

'Metodoque añadirá el elemento en la list view
Private Sub AddItem(ByVal TextoItem As String)
'como este método sera ejecutado en la misma hebra que el list view podemos acceder directamente
Me.lstProceso.Items.Add(TextoItem)
End Sub

Private Sub LlenarLista()
Dim iContador As Integer
Dim iCuentaBis As Integer

'creamos un delegado que "apunta" al método al que llamaremos desde la función invoke
Dim delLlamador As AddItemDelegate = New AddItemDelegate(AddressOf AddItem)

For iContador = 1 To 10000

'creamos un arreglo de objetos con los parámetros que serán enviados con el delegado (en este caso uno solo)
Dim oParametros() As Object = New Object() {"Contador: " & iContador}

'usamos la función invoke para llamar al método al que apunta el delegado
'en la hebra en la que se esta ejecutando el listview
Me.lstProceso.Invoke(delLlamador, oParametros)

For iCuentaBis = 1 To 50000
' retardo
Next
Next

'El método Abort no funciona aquí ya que una hebra no se puede abortar a si misma
'tiene que ser abortada desde la hebra padre que la llamo
'Para terminar la hebra no hace falta hacer nada especial, terminara sola cuando se termine el método
' finalizamos la hebra
'oHebra.Abort()
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Hilos en vb2008 Framework 3.5

Publicado por roger (186 intervenciones) el 08/04/2009 14:56:03
muy buena explicacion, muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar