Threas, delegate y Form

26/05/2004 - 11:28 por david | Informe spam
Hola a todos.

Tengo una clase para gestionar socket utilizando delegate y que se ejecuta
en un threads propio,
el problema esta que defino un método en la clase que contiene el formulario
y es donde voy
recibiendo las llamadas con un parámetro, por ejemplo byte [] recibido, y lo
voy procesando, imprimiendo en textBox, etc.

Al probar la aplicación en una plataforma WinCE cuando intento escribir en
un textBox la aplicación se bloquea.

Buscando información en internet he encontrado referencias especificando que
no se puede llamar desde un hilo mediante
delegate a un método de un formulario que se actualice, a no ser que se
utilice Invoke, el problema esta que los ejemplos que
he visto del uso de invoke no están soportados en WinCe.

A alguien se le ocurre una manera de solucionar este problema. Gracias.

Preguntas similare

Leer las respuestas

#1 Rodrigo Meneses
26/05/2004 - 15:20 | Informe spam
Saludos,
Se me ocurre que quizás depende del Apartment Thread Model de los windows
forms.
Intenta con [STAThread] y [MTAThread]
Indícame por favor si esto resulve tu problema. También podrías considerar
utilizar
la clase System.Threading.ThreadPool.
Es todo por ahora,
-Rodrigo Meneses
Arquitecto de Software
www.vedantek.com

"david" <[No Spam] wrote in message
news:0rZsc.586937$
Hola a todos.

Tengo una clase para gestionar socket utilizando delegate y que se ejecuta
en un threads propio,
el problema esta que defino un método en la clase que contiene el


formulario
y es donde voy
recibiendo las llamadas con un parámetro, por ejemplo byte [] recibido, y


lo
voy procesando, imprimiendo en textBox, etc.

Al probar la aplicación en una plataforma WinCE cuando intento escribir en
un textBox la aplicación se bloquea.

Buscando información en internet he encontrado referencias especificando


que
no se puede llamar desde un hilo mediante
delegate a un método de un formulario que se actualice, a no ser que se
utilice Invoke, el problema esta que los ejemplos que
he visto del uso de invoke no están soportados en WinCe.

A alguien se le ocurre una manera de solucionar este problema. Gracias.






Respuesta Responder a este mensaje
#2 Tristan
26/05/2004 - 16:49 | Informe spam
Hola david. Has leido bien. Los controles winforms no son seguros en
operaciones multisubproceso, así es que, teóricamente, todas las operaciones
sobre ellos deben ser ejecutadas desde el subproceso principal. Para eso,
hay que utilizar Invoke, que tiene que funcionar correctamente en CE. Al
menos con el emulador de pocketpc funciona:

this.Invoke(new EventHandler(Invoca));

private void Invoca(object sender, EventArgs e)
{
// Operaciones sobre controles
}

Donde this, debe ser la instancia de un formulario o control. Si no dispones
de ninguna, también puedes hacer:

new Control().Invoke(new EventHandler(Invoca));

Pero que conste, que al menos en el framework normal, la mayor parte de las
operaciones con controles, se pueden hacer desde distintos subprocesos.
Lógicamente hay que evitar ejecutar operaciones paralelas sobre el mismo
recurso.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 BxCx
27/05/2004 - 05:45 | Informe spam
"Tristan" escribió en el mensaje
news:O%
menos con el emulador de pocketpc funciona:



Dime, ¿dónde puedo ver información de dicho emulador?

Gracias.
Respuesta Responder a este mensaje
#4 david
27/05/2004 - 08:45 | Informe spam
Gracias a todos, en la siguiente pagina hay un ejemplo para implementarlo en
plataformas WinCE.

http://atomic.quilogy.com/mobility/...-hol13.htm


"Tristan" escribió en el mensaje
news:O%
Hola david. Has leido bien. Los controles winforms no son seguros en
operaciones multisubproceso, así es que, teóricamente, todas las


operaciones
sobre ellos deben ser ejecutadas desde el subproceso principal. Para eso,
hay que utilizar Invoke, que tiene que funcionar correctamente en CE. Al
menos con el emulador de pocketpc funciona:

this.Invoke(new EventHandler(Invoca));

private void Invoca(object sender, EventArgs e)
{
// Operaciones sobre controles
}

Donde this, debe ser la instancia de un formulario o control. Si no


dispones
de ninguna, también puedes hacer:

new Control().Invoke(new EventHandler(Invoca));

Pero que conste, que al menos en el framework normal, la mayor parte de


las
operaciones con controles, se pueden hacer desde distintos subprocesos.
Lógicamente hay que evitar ejecutar operaciones paralelas sobre el mismo
recurso.

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
#5 Tristan
28/05/2004 - 01:28 | Informe spam
Pero... ¿quieres decir que lo que te he escrito no funciona?. No tengo un
pocket pc (mejor dicho lo tengo pero no acepta el cf). Solo lo puedo probar
con el emulador, y en este, funciona perfectamente.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida