1

NPAPI プラグインを開発しており、ブラウザのメイン スレッドからコードを実行する必要があります。

NPAPI プラグインのスレッド モデルとは何ですか? NPAPI が実行されるデフォルトのスレッドは何ですか? ブラウザのメイン スレッドからコードを実行するにはどうすればよいですか?

4

2 に答える 2

4

smorgan が言ったように、ブラウザーのスレッド モデルは、ブラウザーへのすべての呼び出しがメイン スレッドで発生する必要があるというものです。これには 1 つまたは 2 つの奇妙な例外がありますが、サポートには多少の一貫性がありません。

NPN_PluginThreadAsyncCallは、まさにこの問題を解決するために導入されました。データが渡されるように関数ポインターと void* を受け入れ、メインスレッドでその関数を呼び出します。もちろん、固有の競合状態により、プラグインのシャットダウン中に NPN_PluginThreadAsyncCallを呼び出すと、関数が呼び出されることが保証されないため、ここでいくつかの注意が必要です。FireBreathは、こ​​れを処理してメモリ リークを防ぐために、かなり風変わりなブードゥー教を実行します。

FireFox 以外のブラウザーをサポートしようとすると、事態はさらに悪化します。私の知る限り、FireFox はすべてのバージョンでこの API 呼び出しをサポートしていますが、少なくとも一部のバージョンの Safari (特に 64 ビット) は NPN_PluginThreadAsyncCall をサポートしていません。最も興味深いことに、それらは時々それをサポートしているように見えますが、それを使用しようとするとクラッシュする悪い関数ポインターになってしまいます。これは非常に最近のバージョンで修正された可能性があります。サポートされているかどうかを正しく検出できないという問題を回避するために、Mac で NSTimer を使用するようにかなり前に変更したため、わかりません。また、Windows 上の Opera はそれをサポートしていないことが知られています。FireBreath はメッセージ HWND を使用し、PostMessage を実行して、サポートされていない Windows ブラウザーのメイン スレッドで呼び出しを行います。

同様の問題が Linux のどこかに存在するかどうかはわかりません。懸念しているプラ​​ットフォームを指定しませんでした。Linux で問題が発生したという話は聞いたことがありませんが、それが意味することも意味しないこともあります。

このトピックについて読む価値のあるその他の質問: Generating async Javascript events from browser plugin (NPAPI) How to callback plugin thread on Safari 5.1 on OSX?

幸運を

于 2012-12-10T05:26:02.993 に答える
2

NPN_*スレッド モデルは、ブラウザがメイン スレッドでプラグインを呼び出し、メイン スレッドからメソッドを呼び出す必要があるというものです。

于 2012-12-09T20:45:30.167 に答える