Multithreading 在NPAPI插件被销毁之前,等待工作线程完成

Multithreading 在NPAPI插件被销毁之前,等待工作线程完成,multithreading,npapi,browser-plugin,Multithreading,Npapi,Browser Plugin,我已经编写了一个无窗口NPAPI插件,我将在一个由web浏览器JavaScript调用的插件函数中执行一些持久的操作(例如,发送带有图像数据的http post请求) 为了防止web浏览器挂起,我为每个冗长的操作创建一个辅助线程 我的问题是,如果浏览器在仍有工作线程运行时关闭, 在工作线程完成之前,如何防止插件实例被销毁(在NPP_Destroy?) 对于ActiveX控件,我只需在每次启动/完成工作线程时添加/释放插件实例的引用计数。但对于NPAPI插件,引用计数仅针对NPObject(通过N

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

为了防止web浏览器挂起,我为每个冗长的操作创建一个辅助线程

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

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


任何帮助都将不胜感激。

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

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


欢迎来到plugin land——你无法控制生命周期。

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