Hola Gente!!!

A ver si hay algún genio que puede dar una mano... Paso a detallar.

Estoy desarrollando una aplicacion en vb.net 2.0 que muestra una info en
pantalla en un datagridview,
y la misma se refresca cada 15 segundos. Tengo definido un Menú Contextual
con opciones de
configuracion y para salir. Los controles que tiene el form principal son: 1
imagen, 2 labels y el
datagridview. Éste datagridview es un control que tiene metodos y
propiedades agregados por mi.
Uno de los labels muestra la hora actual que se refresca vía un control
timer. Tengo un
subproceso que lo llama en un thread. Este proceso debe hacer un refresco en
el form. y llama a un
metodo que esta en una clase que hereda de la datagridview q tira la
consulta sobre un Ms-SQL. Éste
método llama a un stored procedure y devuelve un dataset.
Aparte de esto, cada 50 segundos aparece otra ventana arriba q muestra otra
info.

Si uno hace esto de una forma "normal", cuando se ejecuta tira que
"Operación no válida a través de
subprocesos: Se tuvo acceso al control 'frmPrincipal' desde un subproceso
distinto a aquel en que lo creó."
A menos que coloque

CheckForIllegalCrossThreadCalls = False

Que deshabilita el control de acceso a controles desde los threads.

El tema, es que estuve investigando ésto y no se bien como usarlo para todo
lo que necesito.
Éste ejemplo está en la ayuda del visual studio:

' This event handler creates a thread that calls a
' Windows Forms control in a thread-safe way.
Private Sub setTextSafeBtn_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles setTextSafeBtn.Click

Me.demoThread = New Thread( _
New ThreadStart(AddressOf Me.ThreadProcSafe))

Me.demoThread.Start()
End Sub


' This method is executed on the worker thread and makes
' a thread-safe call on the TextBox control.
Private Sub ThreadProcSafe()
Me.SetText("This text was set safely.")
End Sub

Private Sub SetText(ByVal [text] As String)

' InvokeRequired required compares the thread ID of the
' calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If Me.textBox1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
Else
Me.textBox1.Text = [text]
End If
End Sub


Ésto lo entiendo a medias, y me sirve para actualizar un textbox. Pero el
metodo que hace la consulta
SQL, me devuelve un dataset que se asigna al datasource de la grilla. En
éste caso no se como
usarlo. Es la primera vez que uso thread y no tengo del todo claro todavía.
Necesito hacer ésto porque
la aplicación me es inestable, generando aleatoriamente un "Referencia a
objeto no establecida como
instancia de un objeto".

MUCHAS GRACIAS ANTICIPADAS!

Salu2!
Pedro M. Torres

Responder a