Pedro,
Creo que es una cosa así, esto no lo probé pero mas o menos es la idea...

Ojo, capaz esto funciona pero no es lo recomendado...


  public delegate void FillDataGridDelegate(DataSet ds);

        private void Fill_DataSet(DataSet ds)
        {
            if (this.grid.InvokeRequired)
            {
                FillDataGridDelegate d = new FillDataGridDelegate(Fill_DataSet);
                this.Invoke(d, new object[] { ds });
            }
            else
            {
                grid.DataSource = ds.Tables[0].DefaultView;
                grid.DataBind();
            }
        }

Suerte,
GABRIEL

De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Gustavo Ringel
Enviado el: lunes, 30 de junio de 2008 14:48
Para: [email protected]
Asunto: [puntonet] Uso de Thread - Llamadas seguras a controles en subprocesos

hi, en windows forms como has aprendido no se puede modificar el form desde un 
thread que no sea el del mismo form.

Lo que se hace es ejecutar el methodi Invoke del form el cual ejecuta todo en 
el thread del form actual.

Podes leer en este link mas info, y ejemplos en VB te recomiendo google ya que 
mis ejemplos te los podria escribir en C# y no se seria de ayuda...aunque es 
bien sencillo.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invoke.aspx

Abrazo. Gustavo




2008/6/30 Pedro Martin Torres <[EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>>:
Hola Gente!!!

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

Estoy desarrollando una aplicacion en vb.net<http://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


________________________________
"AVISO LEGAL: Este correo electrónico y cualquier archivo transmitido con él 
pueden contener información propiedad de Ibope Argentina S.A. y/o Monitor de 
Medios Publicitarios S.A., o una de sus filiales o empresas vinculadas. Se 
trata de información confidencial que puede hallarse amparada por el secreto 
profesional. El acceso es restringido y el uso reservado -únicamente- para la 
persona física o jurídica que figura como destinatario del mensaje. Está 
prohibida su difusión y/o cesión y/o transmisión de datos y/o el uso -total o 
parcial- no autorizados expresamente por el remitente (Leyes nº 11.723; 24.766; 
25.326 y concordantes). Si Ud. es el receptor pero no figura como destinatario 
y tampoco es la persona autorizada de entregar el correo electrónico al 
destinatario, le advertimos que ha recibido este mensaje por error y que 
cualquier uso, difusión, reenvío, impresión o copia del mismo y de sus archivos 
adjuntos se hallan estrictamente prohibidos. Si Ud. no es el destinatario 
especificado en este mensaje ni la persona debidamente autorizada por él, por 
favor contactarse inmediatamente con el remitente, eliminando la información 
aquí contenida de su sistema. En ningún caso podrá divulgarse o revelarse el 
contenido de este mensaje a terceros no autorizados. Muchas gracias."

Responder a