2012-01-25 7 views
2

私は、比較的シンプルなシナリオであると思われる解決策を見つけようとしています。私はjavascriptをHTMLページで実行しています。このページは、私がC++で書いたXPcomを呼び出します。ここまでは順調ですね。XPcomからの外部イベントのjavascriptへの通知

このXPcomは、オブザーバーサービス(do_GetService("@mozilla.org/observer-service;1"))への参照を取得します。 javascriptによって通知された通知を起動します。 XPcomはWindowsスレッド(AFX)を作成し、オブザーバーサービス参照のコピーを渡してjavascript呼び出し元に戻ります。 XPcomスレッドが適切な時刻に(外部イベントに基づいて)追加の通知を送信することを期待しています。

しかし、通知はjavascriptには届きません。私の初期の考えは、notifyメソッドが '異なる'スレッドからの通知を配信しないということでした。私はVStudioデバッガを使用して、プログラムのシーケンスが期待どおりであることを確認しました。つまり、外部イベントがスレッドによって受信されており、通知メソッドが呼び出されていますが、通知イベントは到着しません。

私はウェブ上で多くの投稿を読んできましたが、私が取り組もうとしている特定のシナリオは本当に「釘付け」していません。私は通知使用してのアイデアと結婚していないよ:

  • それはワークアウトされていませんが、私が提供するJavaScriptの側から「イベント」を持っていないので、私はどちらかNS_DispatchToCurrentThreadを経由して、イベント通知を試みました。私はXPcomの文脈の中で私自身のものを作ることができ、私はそれを「通知する」ことができます。しかし、それは私がXPcomからイベントを配信できることを証明する単なるPOCでした。今私はjavascriptの側に私に通知するイベントを与える必要があります。
  • 私はnsiSupports argとしてnew'edオブジェクトを渡そうとしました。しかし、DispatchToCurrentThreadはnsiRunnableを必要としており、それらのどれかを渡す方法がわかりません(idlファイルはサポートしていません)。
  • また、nsiSupportsと互換性のある何らかのオブジェクトでイベントを「ラップする」と考えました。しかし、そうする詳細については不明です。

目的は非常に簡単です。 XPcomスレッドからの非同期のイベントまたは通知を、javascriptのメインまたはサブスレッドに配信します。しかし、私はここで10%以下のトラクションを得ています。 誰もこれを達成しましたか?それを達成する方法についてのアイデアがありますか?

ありがとうございました。

答えて

1

あなたは正しいです。オブザーバーサービスはメインスレッドでのみ動作します(Notify()コールの戻り値を確認してください、NS_ERROR_UNEXPECTED)。あなたは解決策が出る限り正しいです - NS_DispatchToMainThread()を介してメインスレッドにイベントをディスパッチしてください。実際の実装に関しては、関数NS_NewRunnableMethod()が役立ちます(カスタムnsIRunnableの実装を作成したい場合を除いて - たとえばパラメータを渡すため)。あなたは、おそらくこのような何かをしたい:

nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(xpcomComponent, &nsMyComponent::processEvent); 
nsresult rv = NS_DispatchToMainThread(event); 

ここxpcomComponentあなたのXPCOMコンポーネントのインスタンスとメインスレッドで呼び出される必要があるnsMyComponent::processEventそのメソッドへの参照になります。その方法は、オブザーバに通知することができます。

+0

うわー!!素晴らしいウラジミール...それは絶対に素晴らしい仕事をした...ありがとう、ありがとう、ありがとう。あなたも私の不毛のポストを整理するためにgilly3。 – IRocks

関連する問題