Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Lopardo en 21 Mayo 2011, 18:15 pm



Título: Encpsular Objeto para ejecutar por hilo principal
Publicado por: Lopardo en 21 Mayo 2011, 18:15 pm
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


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: x64core en 21 Mayo 2011, 18:43 pm
emmm  podrias poner tu code para guiar mejor  :P


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: raul338 en 21 Mayo 2011, 19:09 pm
.... no puede ser utilizado por hilos hijos (algo que no permite vb.net)

Ahi ya empezamos mal (?). Te lo muevo a programacion .net

Lo de los delegados es una forma, o seria crearlo por el hilo Padre y que ambos accedan, o bien desactivar una propiedad para permitir el libre albedrio entre threads (ultimo recurso :xD)


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: Lopardo en 21 Mayo 2011, 20:40 pm
Hola raul338, a que propiedad te refieres?

Gracias


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: raul338 en 21 Mayo 2011, 20:50 pm
CheckForIllegalCrossThreadCalls, pero es un arma de doble filo ;)

Fuente (http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm)


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: [D4N93R] en 22 Mayo 2011, 19:49 pm
Entiendo tu planteamiento, pero no entiendo tu pregunta. Qué ganas encapsulando el WB? El dispatch? Nunca podrás crear el WB en otro hilo sin que te salga la excepción (olvidate de CheckForIllegalCrossThreadCalls xD) porque todo lo que requiera de "pintado de controles" necesita ejecutarse en el hijo principal.

No entiendo eso de que métodos privados y tal, si son privados no vas a poder acceder a ellos :S

Replantea la pregunta, sin explicar el escenario porque ya lo tengo claro.. :)


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: seba123neo en 22 Mayo 2011, 20:08 pm
busca en un proyecto que publique hace poco de un buscador de mercadolibre, ahi yo uso un thread y para que no salte ese error uso la solucion mas comun que es Invoke, buscalo y fijate.igual en internet tenes varias soluciones para solucionar el tema de los controles en un thread.

saludos.


Título: Re: Encpsular Objeto para ejecutar por hilo principal
Publicado por: Lopardo en 23 Mayo 2011, 02:53 am
[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.