Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Lopardo

#1
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.
#2
Hola amigos he programado una librería en .Net Framework 4.0 pero necesito que funcion en la versión 2.0.. No la he programado directamente en 2.0 porque una clase requiere heredar de System.Dynamic y esa clase está en System.Core de la version 4.0.  Lo que se me ocurre es convertir la dll que genera el 4.0 a 2.0 a menos que se pueda encontrar otra solución.

Gracias por su ayuda.
#3
[D4N93R],

te explico porque encapsular el WB, lo que pasa es que si le paso el wb a las funciones que lo utilizan va a dar error porque acceden usando el hilo en cuestión, ahora bien, si lo encapsulo podría hacer que cada vez se quiera acceder a un propiedad del wb lo haga mediante un delegado del hilo principal..

Ya logré encapsular el wb usando Dynamic Object lo malo es que se necesita .Net Framework 4.0 y que el objeto ya no sería de tipo WebBrowser, si no, de la clase donde lo encapsulé.. y al pasarlo a funciones que reciban específicamente un wb me va a dar error, no se me ha ocurrido una forma de hacerlo parecer ahora un wb, ya sea haciendo que implemente algunas interfaces o no se... si se les ocurre algo.. o una mejor manera de hacerlo sería bueno que compartieran la info..

seba123neo ,
entiendo lo que dices, el asunto está en que no puedo modificar las funciones que usan el wb para decirle que cada vez que lo vayan a usar empleen un delegado, por eso viene lo de modificar el wb.

Saludos. Gracias por su ayuda.
#4
Hola raul338, a que propiedad te refieres?

Gracias
#5
hola a todos, el problema que tengo es el siguiente,  tengo una función (funcion1) que recibe varios parámetros entre ellos un WebBrowser (wb), y quiero que la tarea que vaya a realizar esta función sea en paralelo, entonces, creo un nuevo hilo (hilo2) para ese objetivo, el problema viene cuando hilo2 intenta utilizar el wb, estoy seguro que la razón de ésto es porque el wb es un objeto creado por el hilo principal (hilo1) y no puede ser utilizado por hilos hijos (algo que no permite vb.net), entonces, lo que quiero hacer es encapsular el wb en un objeto de tal forma que cuando el hilo2 intente acceder a éste, se invoque al hilo1 para que éste se encargue de gestionar la tarea.

Una solución es que cada vez que vaya a utilizar el wb invoque a un delegado y realice la tarea con el wb por medio del hilo1, pero entonces, en cada lugar donde quiera utilizar el wb debería invocar al delegado.. esta solución la he probado y funciona correctamente, el asunto está en que no es factible, debido a que las funciones que utilizan el wb ya existen y son muchas y gran cantidad de esta son privadas y no tengo acceso a su código fuente, por eso he pensado en encapsular el wb dentro de otro objeto para que cuando se quiera acceder a este se ejecute el delegado que les menciono y éste se encargue de acceder a las propiedades que se estén requiriendo.

También he pensado que si pudiera sobreescribir todos los métodos de la clase WebBrowser y en el objeto wb cada vez que se intente acceder a algún método o campo lo hiciera a través de estos métodos sobreescritos, entonces, por medio del delegado llamaría a los métodos originales, el asunto está en que el objeto wb tiene una infinidad de métodos y como haría esto de forma dinámica.. esto es otra idea pero no se si sea factible.

Si tienen alguna otra idea sería bueno conocerlas.. gracias por su ayuda.

Saludos
#6
Entiendo, sin embargo, preguntaba algo más como, usar las funciones empleadas por la aplicación .Net Reflector que supongo deben encontrarse en sus dll para conseguir lo que quiero. Podría ser que importo la dll de esta aplicación a mi proyecto y hago uso de ciertos métodos propios de ellos o algo así. La idea es hacer uso del .Net Reflector, ya sea sus dll o el .exe como tal para obtener la conversión que quiero, o que me decompile un dll y me retorne el resultado en un txt. Puedo hacerlo manualmente, pero me gustaría lograr que lo haga automáticamente, mandarle un archivo y que me retorne algo, no saben si esta aplicación tiene alguna opción para hacer esto?

Saludos

#7
Hola a todos, me gustaría saber si cuentan con algún manual o información sobre las dll que usa .Net Reflector para decompilar y pasar el código de un lenguaje a otro, es que estoy interesado en hacer uso de este en mi propia aplicación para ver los diferentes códigos en C# o Vb.net, según la necesidad.

Tendrán alguna idea de donde puedo conseguir información al respecto. Gracias.
#8
Cuando hablo de código VML me refiero a Vector Markup Language,

Por ejemplo, para hacer una linea de un punto a otro el código vml necesario sería:


<v:line from="0,0" to="800,500"></v:line>


Entonces, en alguna parte de un documento de word a medida que se van creando gráficos, se va generando ese código y me gustaría saber donde lo puedo obtener.

Saludos
#9
Hola a todos, lo que quiero hacer es visualizar el código VML de un documento de word. Conocen de alguna función que puede ejecutar en un macro para que me retorne el código fuente de la pagina y poder extraer el código vml que me interesa.

Si guardo el documento como web y veo el html que genera no guarda el código vml, si no, transforma los gráficos a imágenes y eso es lo que muestra.

Saludos.
#10
Es correcto, el programa permite programar funciones en cualquiera de los lenguajes de .net.

Este está programado en .net, los hilos los he creado de varias formas, usando BackGroundWorker, creando unas instancia de Thread, incluso usando timer, el problema de este último es que sería el mismo hilo principal y por lo tanto si se ocupa en cualquiera de los timer se tendría que esperar que finalice, y es exactamente lo que no quiero que ocurra.

Lo que creo que solucionaría mi el asunto es que el hilo principal sea el que ejecute ciertas funciones que están en las dll y no sea otro hilo. Por eso pregunto si existirá alguna forma de hacer que el hilo principal realice varios procesos al mismo tiempo, simulando la concurrencia, o que un nuevo hilo simule al hilo principal, permitiendo de esta manera hacer uso de los controles creados cuando se inicializaron los objetos de las dll.

Cualquier comentario es útil. gracias por su ayuda.