COM: llamar desde otro subproceso provoca bloqueos, ¿cómo hacer que se ejecute en el mismo subproceso?

StackOverflow https://stackoverflow.com/questions/199972

  •  11-07-2019
  •  | 
  •  

Pregunta

Estoy haciendo un BHO (extensión para IE) que recibe eventos en otro hilo. Cuando accedo al DOM desde ese otro hilo, IE se bloquea. ¿Es posible hacer que se acceda al DOM desde el mismo subproceso que el subproceso BHO principal para que no se bloquee?

Parece un problema general de multihilo COM, que no entiendo mucho.

¿Fue útil?

Solución

Considere el uso de CoMarshalInterface o CoMarshalInterThreadInterfaceInStream

Esto le dará una interfaz envuelta a un objeto STA COM que es seguro para subprocesos.

Otros consejos

No sé mucho acerca de las extensiones de IE, pero parece que algunos objetos COM deben marcarse como Apartamento de un solo subproceso, por lo que el sistema de tiempo de ejecución COM garantiza que se ejecute en el mismo subproceso que lo llamó inicialmente. Si no puede alterar el otro objeto, probablemente podría enrutar sus llamadas al DOM a través de un objeto COM separado marcado como STA para lograr el mismo efecto. Espero que esto ayude ... Sé un poco sobre COM multihilo, pero no mucho sobre extensiones de IE.

ah, divertido, divertido, multihilo con COM.

La respuesta de Gerald se ve bien si desea transferir un puntero de interfaz de un hilo a otro exactamente una vez. Descubrí que el GIT (tabla de interfaz global) es una gran ayuda para este tipo de cosas si se encuentra en un sistema multiproceso ... básicamente no se mantiene cerca de los punteros de interfaz, sino más bien las cookies DWORD utilizadas por el GIT para obtén un puntero de interfaz correctamente ordenado para cualquier hilo que lo estés usando. (primero debe registrar el objeto en cuestión con el GIT, y anular el registro más tarde cuando haya terminado o su objeto esté terminado)

Tenga cuidado sin embargo. El rendimiento puede convertirse en un problema grave.

Si solo está jugando para aprender sobre BHO, puede usar el STA para hacer que su objeto de implementación :: SetSite () funcione como si fuera un solo subproceso (esto le permite dejar que otros subprocesos saquen el puntero de su BHO de la GlobalInterfaceTable como @JasonS menciona.

Si está haciendo algo que se espera que sea parte de un producto, le recomiendo que reconsidere con mucho cuidado ir a MTA donde sea que pueda y manejar los problemas de concurrencia y seguridad de los hilos usted mismo. En este caso, solo necesitaría asegurarse de que los subprocesos que interactúan con su objeto BHO COM, se inicializaron para COM.

Por ejemplo, si desea monitorear los datos entrantes / salientes del sitio web buscando cosas (ya sean peligrosas o sensibles), entonces NO desea forzar todos esos hilos por la garganta de un objeto STA porque, usando Yahoo como Por ejemplo, se lanzarán más de 30 solicitudes y su BHO comenzará a bloquear IE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top