2012-03-26 19 views
0

(Components.classesとComponents.interfacesを使用して)XPCOMコンポーネントを作成して作業する非同期実行タスク(pure JS)を作成する必要があります。 ただし、WorkerとChromeWorkerはコンポーネントにアクセスできません。また、XPCOMコンポーネントはシリアライズできないため、メインスレッド(postMessage)で作成されたXPCOMコンポーネントを渡すことはできません。XPCOMコンポーネントにアクセスできる非同期タスクは可能ですか?

nsIThreadとnsIThreadManagerで可能できるようですが、ドキュメントは2.0より前のGeckoのバージョンで

が、本当の非同期スレッドを作成することが可能であると述べています。 これは深刻な悪影響なしに達成することができますが、それは安全ではありません。 としばしば予期しないクラッシュが発生します。このため、Gecko 2.0以降、スレッドマネージャー をJavaScriptから使用できないようにするために、ある種のスレッドから別のスレッドにJavaScriptオブジェクトを渡すことができなくなりました( )。

私はGecko 2.0との互換性を導入したくありません。

他の方法がありますか?

P. S.(Chrome)WorkerはDOMやコンポーネントにアクセスできないため、ほとんど使用できません。なぜ彼らはそれを使いたいのですか?

答えて

0

ほとんどのXPCOMコンポーネントはスレッドセーフではないため、別のスレッドから作業するとクラッシュするだけです(スレッドマネージャがスクリプトにアクセスできなくなった理由です)。タスクに多くの計算が含まれている場合は、Workerをメインスレッドから移動し、postMessageを使用して、必要に応じてメインスレッドにXPCOMへのアクセスを指示します。主にXPCOMにアクセスしている場合は、もちろん使用されません。メインスレッドで作業を行い、メインスレッドがブロックされていないことを確認するために小さなチャンクに分割する必要があります。

var thread = Components.classes["@mozilla.org/thread-manager;1"] 
         .getService(Components.interfaces.nsIThreadManager) 
         .currentThread; 
var currentStep = -1; 
function nextStep() 
{ 
    currentStep++; 

    // 
    // Execute step currentStep here 
    // 

    // Schedule next step 
    thread.dispatch(nextStep, thread.DISPATCH_NORMAL); 
} 

nextStep(); 

ドキュメント:

+0

ありがとうございます次の処理ステップ、このような何かをスケジュールするnsIEventTarget.dispatch()を使用することができます。私の場合、Workersと自分のXPCOMコンポーネントは非常に不必要なものです。 1つのFirefox拡張オブジェクトと多くの非同期コードが分割されています。 – user1292168

関連する問題