在我的插件中,我创建了一个线程(在我的例子中使用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上工作)。
发布于 2012-07-06 23:48:58
您可以将其实现为互斥的std::deque,其中第一个插入的数据是您弹出的第一个数据。
只需确保您不会同时推送或弹出(使用互斥)。这就是我在插件中使用的:)
发布于 2012-07-06 22:33:11
听起来您只是在覆盖数据(在处理第一个异步调用之前发生两个事件的情况下)。
有两种方法可以解决这个问题:
NPN_PluginThreadAsyncCall的userData参数传递您的数据std::list或queue )存储事件数据(事件将数据放入其中,异步处理程序检索并处理数据)您链接的问题是针对NPN_PluginThreadAsyncCall不可用或无法工作的另一个问题。
https://stackoverflow.com/questions/11354397
复制相似问题