COM: appeler depuis un autre thread provoque des plantages, comment le faire fonctionner sur le même thread?

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

  •  11-07-2019
  •  | 
  •  

Question

Je suis en train de faire un BHO (extension pour IE) qui reçoit des événements sur un autre thread. Lorsque j'accède au DOM depuis cet autre thread, IE se bloque. Est-il possible de rendre le DOM accessible à partir du même thread que le thread principal de BHO afin qu'il ne tombe pas en panne?

Cela ressemble à un problème général de multithreading de COM, que je ne comprends pas beaucoup.

Était-ce utile?

La solution

Envisagez d'utiliser CoMarshalInterface ou CoMarshalInterThreadInterfaceInStream

Ceci vous donnera une interface encapsulée pour un objet STA COM qui est thread-safe.

Autres conseils

Je ne connais pas grand chose aux extensions IE, mais il semblerait qu'un objet COM doive être identifié comme un appartement à un seul thread, de sorte que le système d'exécution COM s'assure qu'il est exécuté sur le même thread que celui qui l'avait appelé initialement. Si vous ne pouvez pas modifier l'autre objet, vous pouvez probablement acheminer vos appels vers le DOM par le biais d'un objet COM distinct, marqué comme STA, pour obtenir le même effet. J'espère que cela vous aidera ... Je connais un peu le multithreading COM, mais pas grand-chose des extensions IE.

ah, amusant amusant amusant multithreading avec COM.

La réponse de Gerald s’applique correctement si vous souhaitez transférer un pointeur d’interface d’un fil à un autre exactement. J'ai trouvé que le GIT (table d'interface globale) est une aide précieuse pour ce genre de choses si vous êtes dans un système multithread ... en gros, vous ne conservez pas les pointeurs d'interface, mais les cookies DWORD utilisés par le GIT pour Obtenez un pointeur d'interface correctement marshalé pour le fil que vous utilisez. (vous devez d'abord enregistrer l'objet en question auprès du GIT, puis l'annuler ultérieurement lorsque vous avez terminé ou lorsque votre objet est terminé)

Attention cependant. Les performances peuvent devenir un problème grave.

Si vous vous contentez de vous renseigner sur les BHO, vous pouvez utiliser la STA pour que votre objet d'implémentation :: SetSite () fonctionne comme s'il ne s'agissait que d'un seul thread (cela vous permet de laisser d'autres threads extraire le pointeur de votre BHO). de GlobalInterfaceTable comme le mentionne @JasonS.

Si vous envisagez de faire partie d’un produit, je vous recommande vivement de reconsidérer l’utilisation du MTA partout où vous le pouvez et de gérer vous-même les problèmes de concurrence et de sécurité des threads. Dans ce cas, il vous suffira de vous assurer que les threads interagissant avec votre objet COM BHO ont eux-mêmes été initialisés pour COM.

Par exemple, si vous souhaitez surveiller les données entrantes / sortantes du site Web à la recherche d'éléments (dangereux ou sensibles), vous ne souhaitez PAS forcer tous ces threads dans la gorge d'un objet STA, car, en utilisant Yahoo comme Par exemple, plus de 30 demandes seront lancées et votre BHO commencera à verrouiller IE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top