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.

Preguntas similare

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.






Respuesta Responder a este mensaje
#2 Diego \(DCD\)
24/02/2006 - 19:50 | Informe spam
Gracias Alejandro, funciona perfectamente.
Un saludo.
"Alejandro Mezcua" <alejandro.mezcua en byteabyte.net> escribió en el
mensaje news:
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.
>
>
>
>
>
>



Respuesta Responder a este mensaje
#3 Alejandro Mezcua
24/02/2006 - 20:01 | Informe spam
Uy, no había leido la segunda pregunta y sólo te he contestado la primera.

Por lo que dices parece que no estás cerrando los formularios, y sólo los
minimizas. Compruébalo viendo si te aparece una 'x' para cerrarlo o un 'ok'.
Si sale una 'x', al pulsarla, se minimizan, pero en el visor de tareas del
pocket pc, verás una entrada por cada formulario.

Lo más cómodo es poner la propiedad 'Minimize Box' a False. Verás que
aparece un 'ok' en lugar de la 'x' que hará que el formulario se cierre.

Lo que no verás es un descenso inmediato de la memoria consumida, ya que la
gestiona el recolector de basura, que la irá liberando según lo crea
conveniente.

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.






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida