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."