【问题标题】:COM: calling from other thread causes crashes, how to make it run on the same thread?COM:从其他线程调用会导致崩溃,如何让它在同一个线程上运行?
【发布时间】:2010-09-17 00:44:25
【问题描述】:

我正在做一个在其他线程上接收事件的 BHO(IE 扩展)。当我从其他线程访问 DOM 时,IE 崩溃。是否可以使 DOM 从与主 BHO 线程相同的线程访问,以免崩溃?

好像是一般的COM多线程问题,不太懂。

【问题讨论】:

    标签: multithreading com bho


    【解决方案1】:

    考虑使用CoMarshalInterfaceCoMarshalInterThreadInterfaceInStream

    这些将为您提供一个线程安全的 STA COM 对象的封装接口。

    【讨论】:

    • 就是这样!太感谢了!所以在主线程中,调用 CoMarshalInterThreadInterfaceInStream,将流指针传递给辅助线程,在辅助线程上调用 CoGetInterfaceAndReleaseStream 以获取要调用的对象的代理
    【解决方案2】:

    我对 IE 扩展了解不多,但听起来有些 COM 对象需要标记为单线程单元,以便 COM 运行时系统确保它在最初调用它的同一线程上运行。如果您无法更改其他对象,您可能会通过标记为 STA 的单独 COM 对象将调用路由到 DOM 以实现相同的效果。希望这会有所帮助...我对 COM 多线程有所了解,但对 IE 扩展了解不多。

    【讨论】:

      【解决方案3】:

      啊,有趣的有趣的 COM 多线程。

      Gerald's answer 如果你想将一个接口指针从一个线程传输到另一个线程,那么它看起来是正确的。我发现如果你在一个多线程系统中,GIT(全局接口表)对这种事情有很大帮助......基本上你不会保留接口指针,而是 GIT 使用的 DWORD cookie为您正在使用的任何线程获取一个经过适当编组的接口指针。 (您必须先在 GIT 中注册有问题的对象,然后在完成或对象完成后取消注册)

      【讨论】:

        【解决方案4】:

        不过要小心。性能可能会成为一个严重的问题。

        如果您只是想了解 BHO,可以使用 STA 使 ::SetSite() 实现对象像单线程一样运行(这允许您让其他线程拉出 BHO 的指针@JasonS 提到的 GlobalInterfaceTable 的。

        如果您正在做一些预期会成为产品一部分的事情,我强烈建议您非常仔细地重新考虑尽可能使用 MTA 并自己处理并发和线程安全问题。在这种情况下,您只需确保与 BHO COM 对象互操作的线程本身已为 COM 初始化。

        例如,如果您想监视网站的传入/传出数据以寻找事物(危险或敏感) - 那么您不想强制所有这些线程进入 STA 对象的喉咙,因为使用 Yahoo 作为例如,将启动 30 多个请求,并且您的 BHO 将开始锁定 IE。

        【讨论】:

          猜你喜欢
          • 2021-03-28
          • 1970-01-01
          • 1970-01-01
          • 2017-05-10
          • 1970-01-01
          • 2013-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多