c++ - 顺序调用 NPN_PluginThreadAsyncCall

标签 c++ firefox npapi

在我的插件中,我创建了一个线程(在我的例子中使用 pthread)来监听外部事件。当事件发生时,我想与 JavaScript 进行通信。据我了解,我只能在插件线程中调用 NPN_* 方法。因此,我需要在我的线程中使用 NPN_PluginThreadAsyncCall 来调用其他 NPN_* 方法进行 JavaScript 通信。所以一个简单的流程是

我现在面临的问题是,如果外部连续发生,比如2个不同数据输入的事件,我有时会在回调中收到两次相同的数据(一半的时间返回两个不同的数据) .我猜这是因为 NPN_PluginThreadAsyncCall 是一个异步调用,当两个连续的事件回调时,NPN_PluginThreadAsyncCall 被调用两次,在第一个事件回调到 JavaScript 实际发生之前,数据已经被第二次调用覆盖。

最初,我要返回的事件数据是一个全局变量。但我也尝试过将其更改为局部变量,但似乎没有帮助。有没有其他方法可以使我的代码成为与 JavaScript 对话的顺序调用?

我做了一些研究并发现了这个,How to callback plugin thread on Safari 5.1 on OSX? .但我还是不太明白(我在 Windows 上工作)。

最佳答案

听起来您只是在覆盖数据(如果在处理第一个异步调用之前发生两个事件)。

有两种方法可以解决这个问题:

  • 使用 NPN_PluginThreadAsyncCalluserData 参数传递数据
  • 使用线程安全的容器(例如 std::listqueue 受互斥量保护)来存储事件数据(事件将数据放入,异步处理程序检索并处理它)

您链接的问题是针对 NPN_PluginThreadAsyncCall 不可用或不工作的不同问题。

关于c++ - 顺序调用 NPN_PluginThreadAsyncCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354397/

相关文章:

c++ - Emacs CEDET 语义完成 "cannot find types for ..."

c++ - 用 C++ 写一个 PNG

css - Mozilla Firefox 内容 :url() failure

c++ - "relocation R_X86_64_32S against "链接错误

c++ - 从内存中删除对象

javascript - Firefox - 在 contenteditable 中聚焦一个段落

firefox - 比例图像缩放在 Firefox 和 Chrome 中有效,但在 Safari 中无效

javascript - 使用嵌套对象标记在一页中添加 ActiveX 和 NPAPI 插件

c++ - 使用 C++ 插件从 chrome 浏览器下载并运行 exe

firefox - 如何获取firefox用户代理字符串?