【发布时间】:2010-09-17 00:44:25
【问题描述】:
我正在做一个在其他线程上接收事件的 BHO(IE 扩展)。当我从其他线程访问 DOM 时,IE 崩溃。是否可以使 DOM 从与主 BHO 线程相同的线程访问,以免崩溃?
好像是一般的COM多线程问题,不太懂。
【问题讨论】:
标签: multithreading com bho
我正在做一个在其他线程上接收事件的 BHO(IE 扩展)。当我从其他线程访问 DOM 时,IE 崩溃。是否可以使 DOM 从与主 BHO 线程相同的线程访问,以免崩溃?
好像是一般的COM多线程问题,不太懂。
【问题讨论】:
标签: multithreading com bho
考虑使用CoMarshalInterface 或CoMarshalInterThreadInterfaceInStream
这些将为您提供一个线程安全的 STA COM 对象的封装接口。
【讨论】:
我对 IE 扩展了解不多,但听起来有些 COM 对象需要标记为单线程单元,以便 COM 运行时系统确保它在最初调用它的同一线程上运行。如果您无法更改其他对象,您可能会通过标记为 STA 的单独 COM 对象将调用路由到 DOM 以实现相同的效果。希望这会有所帮助...我对 COM 多线程有所了解,但对 IE 扩展了解不多。
【讨论】:
啊,有趣的有趣的 COM 多线程。
Gerald's answer 如果你想将一个接口指针从一个线程传输到另一个线程,那么它看起来是正确的。我发现如果你在一个多线程系统中,GIT(全局接口表)对这种事情有很大帮助......基本上你不会保留接口指针,而是 GIT 使用的 DWORD cookie为您正在使用的任何线程获取一个经过适当编组的接口指针。 (您必须先在 GIT 中注册有问题的对象,然后在完成或对象完成后取消注册)
【讨论】:
不过要小心。性能可能会成为一个严重的问题。
如果您只是想了解 BHO,可以使用 STA 使 ::SetSite() 实现对象像单线程一样运行(这允许您让其他线程拉出 BHO 的指针@JasonS 提到的 GlobalInterfaceTable 的。
如果您正在做一些预期会成为产品一部分的事情,我强烈建议您非常仔细地重新考虑尽可能使用 MTA 并自己处理并发和线程安全问题。在这种情况下,您只需确保与 BHO COM 对象互操作的线程本身已为 COM 初始化。
例如,如果您想监视网站的传入/传出数据以寻找事物(危险或敏感) - 那么您不想强制所有这些线程进入 STA 对象的喉咙,因为使用 Yahoo 作为例如,将启动 30 多个请求,并且您的 BHO 将开始锁定 IE。
【讨论】: