2012-03-26 3 views
0

Ich muss eine asynchrone ausführende Aufgabe (reines JS) erstellen, die mit XPCOM-Komponenten erstellt und arbeitet (mit Components.classes und Components.interfaces). Worker und ChromeWorker haben jedoch keinen Zugriff auf Komponenten. Außerdem kann ich ihnen keine XPCOM-Komponente übergeben, die im Hauptthread (postMessage) erstellt wurde, da XPCOM-Komponenten nicht serialisierbar sind.Asynchroner Task, der Zugriff auf XPCOM-Komponenten hat: Ist das möglich?

Es scheint, dass es mit nsIThread und nsIThreadManager möglich sein kann, aber Dokumentation besagt, dass

In Versionen von Gecko vor 2.0 ist es möglich, echte asynchrone Threads zu erstellen. Obwohl dies oft ohne ernsthafte Nebenwirkungen erreicht werden kann, ist es weit von sicher und führt oft zu unvorhersehbaren Abstürzen. Aus diesem Grund ist es seit Gecko 2.0 nicht mehr möglich JavaScript-Objekte von einem Thread an einen anderen zu übergeben, wodurch der Thread-Manager aus JavaScript nicht mehr nutzbar ist.

und ich möchte keine Inkompatibilität mit Gecko 2.0 einführen.

Gibt es andere Möglichkeiten, das zu tun?

P. S. Ich finde (Chrome) Workers kaum brauchbar, da sie weder Zugriff auf das DOM noch auf Komponenten haben. Warum würde man sie jemals benutzen wollen?

Antwort

0

Nein, die meisten XPCOM-Komponenten sind nicht Thread-sicher, so dass die Arbeit mit ihnen aus einem anderen Thread nur zu Abstürzen führen würde (weshalb der Thread-Manager für Skripte nicht mehr zugänglich gemacht wurde). Wenn Ihre Aufgabe viele Berechnungen enthält, verwenden Sie Worker, um sie vom Hauptthread zu entfernen, und postMessage, um dem Hauptthread Zugriff auf XPCOM zu geben, wann immer dies erforderlich ist. Wenn es hauptsächlich auf XPCOM zugreift, wird es natürlich nichts nützen. Sie müssen die Arbeit am Haupt-Thread erledigen und in kleine Teile aufteilen, um sicherzustellen, dass der Haupt-Thread nicht blockiert wird. Sie können nsIEventTarget.dispatch() verwenden den nächsten Verarbeitungsschritt, um so etwas zu planen:

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(); 

Dokumentation:

+0

Dank. Es scheint, dass Workers und meine eigene XPCOM-Komponente in meinem Fall ziemlich unnötige Dinge sind. Es wird ein Firefox-Extension-Objekt und viel Asynch-Code geben, aufgeteilt in Teile. – user1292168