Neceseito un ppoquito de ayuyda, todavía estoy mu verde.

24/02/2006 - 12:05 por Diego \(DCD\) | Informe spam
Hola,

tengo varias cosillas a ver quien me puede ayudar.

1º Me he creado una clase que me realiza operaciones con la BBDD. Esta clase
tiene creado un evento que me va informando de lo que va haciendo en
pantalla. Yo hago lo siguiente

sync = new Sincronizacion();
sync.CambioEstado += new
Proquinsa.GesPQIMobile.ClasesAccesoDatos.EstadoEventHandler(sync_CambioEstad
o);
Thread th = new Thread (new ThreadStart(sync.SincronizarClientes));
th.Start();

y en el evento hago lo siguiente:

this.statusBar.Text = args;

y esta es la exception que me salta.

System.NotSupportedException was unhandled
Message="Control.Invoke must be used to interact with controls created on
a separate thread."
StackTrace:
at Microsoft.AGL.Common.MISC.HandleAr()
at System.Windows.Forms.Control.get_Text()
at System.Windows.Forms.Control.set_Text()
at AppMobile.Formularios.Sincronizar.sync_CambioEstado()
at AppMobile.Sincronizacion.SincronizarClientes()

Sé que tengo que utilizar el Control.Invoke, pero no sé ni donde ni como.
¿Debería ser la clase control componente derivado de Control para poder
utilizarlo con Control.Invoke?. Estoy en duda.

2º Mi aplicación, además va abriendo y cerrando formularios cuando voy a la
memoria a comprobar lo que tengo veo que aunque yo cierre los formularios
estos se quedan habiertos y no se cierran. ¿Cómo puedo hacer para que estos
se cierren definitivamente?, ¿hay alguna forma de ver la memoria que está
consumiendo mi programa en el PPC?

Gracias y un saludo.
 

Leer las respuestas

#1 Alejandro Mezcua
24/02/2006 - 18:29 | Informe spam
Hola, Diego.

Tu función del evento está siendo ejecutada por un thread secundario, con lo
que no tiene acceso a propiedades de controles del formulario que modifiquen
el UI, como el statusBar.Text que tienes. Para poder modificar el UI tienes
que hacerlo a través de un delegado.

Uno de los más fáciles de usar es un EventHandler pero podrías definirte uno
tu con tus propios parámetros, ya que a la barra de estado le pasas
parámetros, pero puedes hacerlo con el EventHandler de manera similar a lo
siguiente:

- En el tu función del evento quita la línea this.statusBar.Text = args;
- Create a nivel de clase un delegado de tipo EventHandler (_miDelegado en
la linea de abajo)
- Copia args a una variable de la clase (por ejemplo _args) y ojo con la
sincronización de threads, algo parecido a:

lock(_args)
{
_args = args;
}

- Y luego pide al formulario que llame a tu delegado de tipo EventArgs

this.Invoke(_miDelegado);

- En la función a la que apunte tu delegado acceder a _args donde tendrás
los datos (ojo de nuevo con la sincronización de tus threads, depende de lo
que hagas puedes necesitar usar lock de nuevo, o un mutex, o algo por el
estilo).

Hay más formas de hacerlo, pero esta es una de las más fáciles de entender
para mi.

Pruébalo y si no te va, dilo.

Un saludo,

Alejandro Mezcua
MVP .NET Compact Framework
http://www.byteabyte.net/

"Diego (DCD)" wrote in message
news:uAi$
Hola,

tengo varias cosillas a ver quien me puede ayudar.

1º Me he creado una clase que me realiza operaciones con la BBDD. Esta
clase
tiene creado un evento que me va informando de lo que va haciendo en
pantalla. Yo hago lo siguiente

sync = new Sincronizacion();
sync.CambioEstado += new
Proquinsa.GesPQIMobile.ClasesAccesoDatos.EstadoEventHandler(sync_CambioEstad
o);
Thread th = new Thread (new ThreadStart(sync.SincronizarClientes));
th.Start();

y en el evento hago lo siguiente:

this.statusBar.Text = args;

y esta es la exception que me salta.

System.NotSupportedException was unhandled
Message="Control.Invoke must be used to interact with controls created on
a separate thread."
StackTrace:
at Microsoft.AGL.Common.MISC.HandleAr()
at System.Windows.Forms.Control.get_Text()
at System.Windows.Forms.Control.set_Text()
at AppMobile.Formularios.Sincronizar.sync_CambioEstado()
at AppMobile.Sincronizacion.SincronizarClientes()

Sé que tengo que utilizar el Control.Invoke, pero no sé ni donde ni como.
¿Debería ser la clase control componente derivado de Control para poder
utilizarlo con Control.Invoke?. Estoy en duda.

2º Mi aplicación, además va abriendo y cerrando formularios cuando voy a
la
memoria a comprobar lo que tengo veo que aunque yo cierre los formularios
estos se quedan habiertos y no se cierran. ¿Cómo puedo hacer para que
estos
se cierren definitivamente?, ¿hay alguna forma de ver la memoria que está
consumiendo mi programa en el PPC?

Gracias y un saludo.






Preguntas similares