C++ 对NPN_PluginThreadAsyncCall的序列调用

C++ 对NPN_PluginThreadAsyncCall的序列调用,c++,firefox,npapi,C++,Firefox,Npapi,在我的插件中,我创建了一个线程(在我的例子中使用pthread)来监听外部事件。当事件发生时,我想与JavaScript通信。据我所知,我只能在插件线程中调用NPN_*方法。因此,我需要在我的线程中使用NPN_PluginThreadAsyncCall调用其他NPN_*方法进行JavaScript通信。所以一个简单的流程是 我现在面临的问题是,如果外部事件连续发生,例如,两个具有不同数据输入的事件,我有时会在回调中两次接收相同的数据(在返回两个不同数据的一半时间内)。我猜这是因为NPN_Plug

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

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

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


我做了一些研究,发现了这个。但我还是不太明白(我正在Windows上工作)

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

有两种方法可以实现这一点:

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

您链接的问题是针对另一个问题的,
NPN\u PluginThreadAsyncCall
不可用或不工作。

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

有两种方法可以实现这一点:

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

您链接的问题是针对另一个问题的,
NPN\u PluginThreadAsyncCall
不可用或不工作。

您可以将其实现为一个mutexd,其中第一个插入的数据是第一个弹出的数据


只需确保不要同时按下或弹出(使用互斥键)。这就是我在插件中使用的:)

您可以将其实现为一个静音,其中第一个插入的数据是您弹出的第一个数据



只需确保不要同时按下或弹出(使用互斥键)。这就是我在插件中使用的:)

“所以一个简单的流程是”。。。似乎缺少一些文本/代码?“因此简单的流程是”。。。似乎缺少一些文本/代码?无需使用
deque
如果只需要FIFO,则使用
队列就足够了。嗨,Gui,是的,这就是我使用的方法。到目前为止,它似乎解决了我的问题。我还不太熟悉C++的LIB,所以我用STD:Listar来遵循格奥尔的建议。幸运的是,它有push_-back、front和pop_-front功能来实现FIFO。同时也感谢您分享您的经验:)我还没有足够的声誉这么做:(我不知道为什么您的答案前面有一个-1,我无法点击向上箭头来更改它。不,pb,我不在乎:)我想这是因为我是在Georg之后回答的。谢谢你们两位的帮助:)不需要
deque
如果只需要FIFO,一个
队列就足够了。嗨,Gui,是的,这就是我使用的方法。到目前为止,它似乎解决了我的问题。我还不太熟悉C++的LIB,所以我用STD:Listar来遵循格奥尔的建议。幸运的是,它有push_-back、front和pop_-front功能来实现FIFO。同时也感谢你分享你的经验:)我还没有足够的声誉这么做:(我不知道为什么你的答案前面有一个-1,我不能点击向上箭头来改变它。不,pb,我不在乎:)我想这是因为我是在乔治之后回答的。谢谢你们两位的帮助:)谢谢你的提示。我已经尝试了您的建议1(使用前面提到的局部变量),但似乎没有帮助。我将研究这个建议。是的,我知道这个链接不是直接相关的。但是我希望这个变通办法能解决我的问题,但我不太明白解决办法。如果以后找到一个,我会发布我的解决方案。@dino:你使用局部变量到底是什么意思?您是否试图通过NPN_PluginThreadAsyncCall传递指向函数局部变量的指针?这将不起作用,因为它将超出范围,您需要通过userData传递动态分配的对象。是的,它不起作用。我想我需要释放我创建的对象,并且想知道NPN_PlugintThreadAsyncCall调用时是否会产生单独的线程,所以我尝试在事件回调函数中将局部变量传递给NPN_PlugintThreadAsyncCall。您的第二个提示非常有用。当我开始考虑使用容器满足我的需要时,突然我觉得我真的很愚蠢,使用队列抽象应该可以解决我的问题。因为push总是在pop之前调用,所以我不必担心线程安全。我试过了,到目前为止还不错。非常感谢你的提示。@dino:很高兴听到它对你有用。请记住,除非系统事件调用仅发生在主线程上,否则在共享容器上的并发访问仍然会遇到问题。谢谢您的提示。艾尔