質問: OSXでSafari 5.1のプラグインスレッドをコールバックする方法は? Geckoの関数NPN_PluginThreadAsyncCall/pluginthreadasynccallがSafari 5.1で動作しません(Firefoxが動作します)。私の関数は呼び出されません。別のスレッドで長時間実行されたタスクを実行した後、JavaScriptに関数呼び出しを戻そうとしています。どうすればこの作品を作れますか?
回答: ええ、Safari 5.1と同じ問題が FireBreath にありました。これはあなたがよく知っていない場合は間違いなく見てくださいそれと); NPN_PluginThreadAsyncCallは動作しなくなりました。どのプラットフォームを使用しているのかを指定していないので、MacとWindowsの両方で使用していることを示します。 ウィンドウでは、HWNDというメッセージを作成し、そのHWNDにイベントデータにvoid *を渡すメッセージをLPARAMとして送信します。 void *は、通常はプラグインスレッドが呼び出すparamsを保持するデータ構造体へのポインタに変換され、呼び出しが行われ、データ構造体は解放されます。使用するメッセージウィンドウクラスはこちら、 こちらの場所に電話があります。 (IEでのクロススレッド呼び出しには同じメカニズムを使用しています) Macでは、基本的にはobjective-c performSelectorOnMainThreadを使用します。私たちはそれをC ++から使いやすくするためのクラスにまとめました。 使用するスケジューラクラスはこちら、 ここに呼び出しが行われます。あなたは本当に注意する必要があることに注意してください。なぜならこれらは可能な競争条件がたくさんあり、時にはリエントラントコードで終わることがあるからです。 FireBreathには、クロススレッドコールを完成させるために数十時間の作業が必要です。それは信じられないほどトリッキーな問題です。 うまくいけば、これは役立ちます!