0

私のプラグインでは、外部イベントをリッスンするスレッドを作成します(私の場合はpthreadを使用します)。イベントが発生したら、JavaScriptに通信したいと思います。私が理解している限り、プラグインスレッドでNPN_*メソッドを呼び出すことしかできません。その結果、JavaScript通信用に他のNPN_ *メソッドを呼び出すために、スレッドでNPN_PluginThreadAsyncCallを利用する必要があります。つまり、単純なフローは

私が今直面している問題は、外部が連続して発生する場合、たとえば、異なるデータ入力を持つ2つのイベントが発生した場合、コールバックで同じデータを2回受信することがあります(2つの異なるデータが返される時間の半分)。NPN_PluginThreadAsyncCallが非同期呼び出しであるためだと思います。2つの連続したイベントがコールバックすると、NPN_PluginThreadAsyncCallが2回呼び出され、最初のイベントのJavaScriptへのコールバックが実際に発生する前に、データが2番目の呼び出しによってオーバーライドされます。

最初に、返したいイベントデータはグローバル変数です。しかし、私もそれをローカル変数に変更しようとしましたが、役に立たなかったようです。コードをJavaScriptと通信するためのシーケンシャル呼び出しにする他の方法はありますか?

私はいくつかの調査を行い、これを見つけました、OSX上のSafari5.1でプラグインスレッドをコールバックする方法は?。しかし、私はまだ完全には理解していません(私はWindowsで作業しています)。

4

2 に答える 2

3

単にデータを上書きしているようです(最初のイベントの非同期呼び出しを処理する前に2つのイベントが発生した場合)。

これにアプローチする方法は2つあります。

  • userDataのパラメータを使用しNPN_PluginThreadAsyncCallてデータを渡します
  • スレッドセーフなコンテナ(ミューテックスstd::listなどqueueで保護されている)を使用してイベントデータを保存します(イベントはデータを入力し、非同期ハンドラーはデータを取得して処理します)

リンクした質問は、NPN_PluginThreadAsyncCall利用できない、または機能しない別の問題に関するものです。

于 2012-07-06T14:33:10.520 に答える
0

これをmutexedstd :: dequeとして実装できます。ここで、最初に挿入されたデータが最初にポップされます。

同時にプッシュまたはポップしないように注意してください(ミューテックスを使用してください)。それが私のプラグインで使用しているものです:)

于 2012-07-06T15:48:57.853 に答える