【问题标题】:Wait for worker threads to complete before NPAPI plugin being destroyed在销毁 NPAPI 插件之前等待工作线程完成
【发布时间】:2013-11-25 08:04:19
【问题描述】:

我编写了一个无窗口 NPAPI 插件,我将在 Web 浏览器 JavaScript 调用的插件函数中执行一些持久的操作(例如,发送带有图像数据的 http post 请求)。

为了防止网络浏览器挂起,我为每个冗长的操作创建一个工作线程。

我的问题是,如果浏览器在仍有工作线程运行时关闭, 如何防止我的插件实例在工作线程完成之前被销毁(在 NPP_Destroy 中?)?

对于 ActiveX 控件,我只需在每次启动/完成工作线程时添加/释放插件实例的引用计数。但是对于 NPAPI 插件,引用计数仅针对 NPObject(通过 NPN_CreateObject 创建)而不是插件实例本身。现在我很困惑。

任何帮助将不胜感激。

【问题讨论】:

    标签: multithreading npapi browser-plugin


    【解决方案1】:

    你不能。我想您可以启动另一个进程并执行其中的操作;这样你就可以在插件关闭时向它发送一个信号,并说“你需要关闭,当你准备好时”,但在它完成之前不要关闭它。

    插件本身——即使在 IE 中——你也无法控制它何时关闭,因为如果浏览器关闭它会在此时关闭所有插件。

    欢迎来到插件领域——您无法控制生命周期。

    【讨论】:

    • 我今年刚来March的插件乐园:)。 “在 IE 中,您无法控制它何时关闭,因为如果浏览器关闭,它将在那时关闭所有插件”但是在 IE 中,我可以使用 AddRef()/Release() 来控制我的生命周期插件实例,实际上插件本身不会被销毁,直到工作线程将插件的引用计数减少到 0。当浏览器关闭时,它只会将插件的引用计数减少 1,并且插件不会被破坏当工作线程提前启动时,我将引用计数增加 1(我已经运行调试模式来验证这一点)。
    • 如果我错了,请纠正我。我认为对于 NPAPI 插件来说,拥有用于长期操作的工作线程应该很常见。那么如果浏览器在工作线程刚刚开始工作时立即关闭怎么办?如果插件实例被销毁,访问冲突很容易在工作线程中发生,因为插件的成员数据现在无效。如果另一个进程是处理这种情况的唯一方法,这是否意味着我必须在另一个进程中启动所有工作线程(以防止提到的访问冲突)?我这样做似乎并不常见..
    • 由于使用了COM架构,IE的情况略有不同。每个其他浏览器都会在子进程(或以前在他们自己的进程)中启动插件,并且不允许您控制生命周期。长时间运行的工作线程应该有定期的中断点,您可以在其中取消它们,即使在插件生命周期之外:用户可能想要关闭您的应用程序,系统正在关闭,...
    • 另外,我的经验是,如果进程正在关闭并且您尚未清理,即使 refcount 仍然是正数,IE 也会杀死您的 activex 控件。正如@GeorgFritzsche 所说,您与 NPAPI 处于单独的进程中,无法告诉浏览器不要关闭您。我怀疑,他们实际上认为未连接到特定(现有)插件实例的长时间运行的线程是一种安全隐患。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多