Crear precarga independiente del hilo principal.

Iniciado por Lopardo, 14 Junio 2011, 16:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Lopardo

Hola amigos, todo inicia con éste mensaje de error: Controls created on one thread cannot be parented to a control on a different thread. Muchos ya sabrán la forma de solucionarlo, sin embargo, la solución que busco es una en particular, les explico a continuación.

¿Cuando ocurre éste error? Si creamos un control con un hilo y posteriormente queremos agregar a éste control un nuevo control desde otro hilo. En otras palabras, si por ejemplo, queremos agregar al formulario principal de nuestra aplicación un panel y lo queremos hacer desde otro hilo de ejecución que no sea el principal, entonces, nos lanzará el error visto inicialmente.

¿Formas de solucionarlo?
Una de las formas que he visto para solucionar este problema es hacer uso de un delegado controlado por el hilo principal que se encargue de agregar los nuevos controles.

No tengo nada en contra de esta solución, sin embargo, no es funcional para lo que estoy desarrollando, les explico. Lo que quiero hacer es mostrar una precarga, la cual esta elaborada con un conjunto de controles e imágenes agregadas a éstos, el asunto está en que si agrego la precarga al formulario principal por el hilo principal, cuando el hilo principal esté ocupado realizando alguna labor, la precarga, específicamente el gif de ésta, se detendría de forma intermitente, debido a que el hilo principal que la agregó se encuentra ocupado en otras cosas.. de aquí surge la necesidad de crear un nuevo hilo que se encargue de controlar la precarga, pero al intentar agregar la precarga al formulario principal y me daría el error antes mencionado.

Esta es la razón por la cual usar delegados no me es funcional, ya que se estaría agregando la precarga con el mismo hilo que se va a usar para realizar algunas tareas.

Podrían pensar lo siguientes... si el problema está en que cuando el hilo principal se ocupa se detiene la precarga, entonces, con usar otro hilo para realizar las labores pesadas sería suficiente, sin embargo, no podría, debido a que muchas de estas labores están relacionadas con los controles del formulario principal, por lo que sólo el hilo principal puede acceder a estos, en especial a un control tipo WebBrowser, que al intentar acceder desde otro hilo arroja el siguiente error: Object reference not set to an instance of an object. (esto también se solucionaría usando delegados, pero no me es funcional como les he explicado anteriormente).

Entonces, la pregunta sería. ¿Como puedo crear una precarga independiente del hilo principal y que forme parte del formulario principal?.. digo esto último, que forme parte del formulario principal, porque no me serviría una precarga en un formulario aparte ¿Por qué? principalmente porque las precargas serán múltiples y saldrán en diferentes partes de la aplicación según lo que se esté cargando, apareciendo en diferentes posiciones según sea el caso.

Haciendo uso de CheckForIllegalCrossThreadCalls no solucionaría el problema.

Muchas gracias por su atención, espero que lleguemos a una solución.
...de la sabiduría.