Npapi pluginthreadasynccall挂起浏览器

Npapi pluginthreadasynccall挂起浏览器,npapi,Npapi,我需要从插件中调用javascript函数。为此,我使用npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL)生成了一个线程。在wcfEventForwarder线程函数中,我正在等待另一个库发布的消息(在POSIX消息Q上)。我的目的是接收这些消息,然后将数据(在这些消息中接收)传递给Javascript。 问题是,当我从Invoke使用pluginthreadasynccall(…)监视线程时,浏览器挂起,我

我需要从插件中调用javascript函数。为此,我使用npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL)生成了一个线程。在wcfEventForwarder线程函数中,我正在等待另一个库发布的消息(在POSIX消息Q上)。我的目的是接收这些消息,然后将数据(在这些消息中接收)传递给Javascript。 问题是,当我从Invoke使用pluginthreadasynccall(…)监视线程时,浏览器挂起,我无法再与浏览器交互。你能帮我一个解决办法吗

问候,,
Souvik

您是从另一个线程调用
NPN\u PluginThreadAsyncCall
,还是在“插件线程”内部?

您是从另一个线程调用
NPN\u PluginThreadAsyncCall
还是在“插件线程”内部调用
您完全误解了NPN\u PluginThreadAsyncCall的目的;它不是启动一个新线程,而是在主线程上运行一些东西。你的wcfEventForwarder函数将在主线程上被调用,因此如果你阻止它,它将挂起整个插件

此函数调用的目的是为您提供一种在主线程上触发回调的方法,因为除了NPN_PluginThreadAsyncCall之外,其他线程上不能调用任何NPN_函数。如果您想生成另一个线程,您应该自己使用类似boost::thread的东西或直接使用线程API(选择您的风格)


您还应该注意到,一些较新的浏览器显然已经停止支持NPN_PluginThreadAsyncCall;特别是,它在windows或mac上的Safari 5.1中似乎不起作用,在mac上的某些配置中,我在多个其他浏览器(firefox和chrome)上遇到了问题。

您完全误解了NPN_PlugintThreadAsyncCall的用途;它不是启动一个新线程,而是在主线程上运行一些东西。你的wcfEventForwarder函数将在主线程上被调用,因此如果你阻止它,它将挂起整个插件

此函数调用的目的是为您提供一种在主线程上触发回调的方法,因为除了NPN_PluginThreadAsyncCall之外,其他线程上不能调用任何NPN_函数。如果您想生成另一个线程,您应该自己使用类似boost::thread的东西或直接使用线程API(选择您的风格)


您还应该注意到,一些较新的浏览器显然已经停止支持NPN_PluginThreadAsyncCall;特别是,它在windows或mac上的Safari 5.1中似乎不起作用,在mac上的某些配置中,我在多个其他浏览器(firefox和chrome)上遇到过问题。

好的,我理解你的观点。非常感谢您的澄清。现在,我所做的是使用pthread库创建了一个线程,并从线程体调用-npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL);如果我理解正确,它应该在新创建的线程的上下文中运行,而不应该冻结我的浏览器。但即使这样做了,我也注意到了同样的问题。我正在使用firefox 3.6.22。我是不是遗漏了什么?对不起,请忽略我以前的帖子。我真傻。现在我可以让它运行了。我已经将等待移动到pthread,并调用pluginthreadasynccall(…)将信息发送回浏览器。谢谢你的建议。好的,我明白你的意思。非常感谢您的澄清。现在,我所做的是使用pthread库创建了一个线程,并从线程体调用-npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL);如果我理解正确,它应该在新创建的线程的上下文中运行,而不应该冻结我的浏览器。但即使这样做了,我也注意到了同样的问题。我正在使用firefox 3.6.22。我是不是遗漏了什么?对不起,请忽略我以前的帖子。我真傻。现在我可以让它运行了。我已经将等待移动到pthread,并调用pluginthreadasynccall(…)将信息发送回浏览器。谢谢你的建议。好的,我明白你的意思。非常感谢您的澄清。现在,我所做的是使用pthread库创建了一个线程,并从线程体调用-npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL);如果我理解正确,它应该在新创建的线程的上下文中运行,而不应该冻结我的浏览器。但即使这样做了,我也注意到了同样的问题。我正在使用firefox 3.6.22。我是不是遗漏了什么?对不起,请忽略我以前的帖子。我真傻。现在我可以让它运行了。我已经将等待移动到pthread,并调用pluginthreadasynccall(…)将信息发送回浏览器。非常感谢你的建议。如果我是你,我会认真考虑使用FielSo呼吸()为你的插件;它为您解决了几乎所有这些问题,并在不同的平台上处理了许多棘手的边缘问题。sOK,我理解您的观点。非常感谢您的澄清。现在,我所做的是使用pthread库创建了一个线程,并从线程体调用-npnfuncs->pluginthreadasynccall(savedinstance,wcfEventForwarder,NULL);如果我理解正确,它应该在新创建的线程的上下文中运行,而不应该冻结我的浏览器。但即使这样做了,我也注意到了同样的问题。我正在使用firefox 3.6.22。我是不是遗漏了什么?对不起,请忽略我以前的帖子。我真傻。现在我可以让它运行了。我已经将等待移动到pthread,并调用pluginthreadasynccall(…)将信息发送回浏览器。非常感谢你的建议。如果我是你,我会认真的