Foros del Web » Programación para mayores de 30 ;) » .NET »

No se controló System.NullReferenceException con Hilos (Subprocesos)

Estas en el tema de No se controló System.NullReferenceException con Hilos (Subprocesos) en el foro de .NET en Foros del Web. Estoy probando un simple ejemplo con 3 subprocesos que se ejecutan a la par... en uno de ellos quiero modificar un datagridview (exactamente en el ...
  #1 (permalink)  
Antiguo 03/10/2012, 16:24
Avatar de jhodmar  
Fecha de Ingreso: febrero-2012
Ubicación: Medellin
Mensajes: 52
Antigüedad: 12 años, 2 meses
Puntos: 1
Pregunta No se controló System.NullReferenceException con Hilos (Subprocesos)

Estoy probando un simple ejemplo con 3 subprocesos que se ejecutan a la par... en uno de ellos quiero modificar un datagridview (exactamente en el segundo hilo) y los cuales se ejecutan infinitamente...

heee aquí mi codigo::
Código:
Imports System.Windows.Forms.DataGridView
Imports System.Threading
Public Class Form1
    Private trd As Thread
    Private trd2 As Thread
    Private trd3 As Thread
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("Este es el Hilo principal", MsgBoxStyle.Information, "Informate")
    End Sub
    Private Sub Form1_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        If Me.trd.IsAlive Then
            Me.trd.Abort()
        End If
        If Me.trd2.IsAlive Then
            Me.trd2.Abort()
        End If
        If Me.trd3.IsAlive Then
            Me.trd3.Abort()
        End If
    End Sub
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Control.CheckForIllegalCrossThreadCalls = False
        trd = New Thread(AddressOf ThreadTask)
        trd.IsBackground = True
        trd.Start()
        trd2 = New Thread(AddressOf ThreadTask2)
        trd2.IsBackground = True
        trd2.Start()
        trd3 = New Thread(AddressOf ThreadTask3)
        trd3.IsBackground = True
        trd3.Start()
    End Sub
    Private Sub ThreadTask()
        Dim stp As Integer
        Dim newval As Integer
        Dim rnd As New Random()
        Do
            stp = ProgressBar1.Step * rnd.Next(-1, 2)
            newval = ProgressBar1.Value + stp
            If newval > ProgressBar1.Maximum Then
                newval = ProgressBar1.Maximum
            ElseIf newval < ProgressBar1.Minimum Then
                newval = ProgressBar1.Minimum
            End If
            'Control.CheckForIllegalCrossThreadCalls = False
            Me.TextBox1.Text = newval
            ProgressBar1.Value = newval
            Thread.Sleep(150)
        Loop
    End Sub
    Private Sub ThreadTask2()
        Try
            Dim stp As Integer
            Dim newval As Integer
            Dim rnd As New Random()
            Do
                stp = ProgressBar2.Step * rnd.Next(-1, 2)
                newval = ProgressBar2.Value + stp
                If newval > ProgressBar2.Maximum Then
                    newval = ProgressBar2.Maximum
                ElseIf newval < ProgressBar2.Minimum Then
                    newval = ProgressBar2.Minimum
                End If
                'Control.CheckForIllegalCrossThreadCalls = False
                Me.TextBox2.Text = newval
                ProgressBar2.Value = newval
                'CrearDatagrid(newval)
                Thread.Sleep(10000)
            Loop
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Sub ThreadTask3()
        Dim stp As Integer
        Dim newval As Integer
        Dim rnd As New Random()
        Do
            stp = ProgressBar3.Step * rnd.Next(-1, 2)
            newval = ProgressBar3.Value + stp
            If newval > ProgressBar3.Maximum Then
                newval = ProgressBar3.Maximum
            ElseIf newval < ProgressBar3.Minimum Then
                newval = ProgressBar3.Minimum
            End If
            'Control.CheckForIllegalCrossThreadCalls = False
            Me.TextBox3.Text = newval
            ProgressBar3.Value = newval
            Thread.Sleep(50)
        Loop
    End Sub
    Function CrearDatagrid(ByVal NumeroFila As Integer) As Integer
        Try
            If NumeroFila = 0 Then
                NumeroFila = 5
            End If
            'Me.DataGridView1 = New DataGridView
            Me.DataGridView1.Rows.Clear()
            Me.DataGridView1.Columns.Clear()
            For i As Integer = 0 To 3
                Me.DataGridView1.Columns.Add("columna" + CStr(i), "Columna: " + CStr(i + 1))
            Next
            For i As Integer = 1 To NumeroFila
                Me.DataGridView1.Rows.Add("Fila", i, "Ejemplo", ".... ")
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

    Private Sub DataGridView1_DataError(sender As System.Object, _
                                        e As System.Windows.Forms.DataGridViewDataErrorEventArgs) _
                                                            Handles DataGridView1.DataError
        ''evitando Errores
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        trd2 = New Thread(AddressOf ThreadTask2)
        trd2.IsBackground = True
        trd2.Start()
    End Sub
End Class
Todo esta en un ciclo infinito
bueno .. después de varias pasadas me vota el error

"No se controló System.NullReferenceException"
"Referencia a objeto no establecida como instancia de un objeto."
estoy seguro que es cuando manipulo el datagrid, ya que he quitado la llamada a la funcion y se ejecuta correctamente hasta que termino la ejecución!

les agradezco de antemano y espero me puedan ayudar ... GRACIAS!
  #2 (permalink)  
Antiguo 04/10/2012, 08:25
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: No se controló System.NullReferenceException con Hilos (Subprocesos)

Primero no uses Control.CheckForIllegalCrossThreadCalls = False no lo veo recomendable para esto trata de usar delegados para poder modificar controles que se encuentran en el primer proceso.

Segundo especifica en que linea te esta generando error especificamente

Saludos
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 05/10/2012, 09:33
Avatar de jhodmar  
Fecha de Ingreso: febrero-2012
Ubicación: Medellin
Mensajes: 52
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: No se controló System.NullReferenceException con Hilos (Subprocesos)

Inicialmente el problema con linea exacta no se especificamente donde se produce, por eso pase todo el codigo.

pero bueno gracias amigo y si, tenes razón he optado por crear delegados...(jamas los habia necesitado) y así no me salta la excepción.

algo como esto
Declaro mi hilo donde quiero que se inicie:
Código:
Dim t As New Thread(AddressOf enOtroHilo)''llamando
t.Start()
aqui se ejecuta la instruccion:
Código:
Private Sub enOtroHilo()
        Dim rnd As New Random()
        Dim TableHilos As New DataTable
        For i As Integer = 0 To 3
            TableHilos.Columns.Add("columna" + CStr(i))
        Next
        Dim filas As Integer = rnd.Next(100000, 4000000)
        Me.ProgressBar2.Maximum = filas
        For i As Integer = 1 To filas
            TableHilos.Rows.Add("Fila", i, "Ejemplo", ".... ")
            Me.ProgressBar2.Increment(1)
        Next
        ''mandamos nuestro valor
        SetText(TableHilos)
    End Sub
y por ultimo el delegado:
Código:
Private Delegate Sub DelegadoData(ByVal DSHilo As DataTable)
    Private Sub SetText(ByVal DSHilo As DataTable)
        'la propiedad InvokeRequired es verdadero, si es así, 
        'quiere decir que el hilo en el que está actualmente esa llamada es diferente al hilo en el que se creó el control, 
        'por tanto, creamos un nuevo objeto del tipo del delegado, le indicamos que método debe usar 
        'y a continuación llamamos al método Invoke de nuestro formulario, cuando se entre nuevamente en ese método 
        '(porque el formulario lo "invoca") el valor que devolverá la propiedad InvokeRequired será False, 
        'ya que el hilo en el que está es el mismo en el que se creó el control, ya que es el mismo hilo usado por el formulario
        If DataGridView3.InvokeRequired Then
            Dim d As New DelegadoData(AddressOf SetText)
            Me.Invoke(d, New Object() {DSHilo})
        Else
            Me.DataGridView3.DataSource = DSHilo
        End If
    End Sub
como ven al datagrid le mando el datatabe al final de todo
mi habilidad en programacion aumento en +1
GRACIAS!

Etiquetas: datagridview, hilos, textbox, windows
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:26.