在我的插件中,我创建了一个线程(在我的例子中使用 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_PluginThreadAsyncCall
的userData
参数传递数据 - 使用线程安全的容器(例如
std::list
或queue
受互斥量保护)来存储事件数据(事件将数据放入,异步处理程序检索并处理它)
您链接的问题是针对 NPN_PluginThreadAsyncCall
不可用或不工作的不同问题。
关于c++ - 顺序调用 NPN_PluginThreadAsyncCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354397/