0

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

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

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

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

4

2 回答 2

3

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

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

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

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

于 2012-07-06T14:33:10.520 回答
0

您可以将其实现为互斥的std::deque,其中第一个插入的数据是您弹出的第一个数据。

只要确保您不会同时推送或弹出(使用互斥锁)。这就是我在我的插件中使用的:)

于 2012-07-06T15:48:57.853 回答