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]>:

> 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