Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Browser freeze

Envoyé par : skuallpa

Date : 26/10/2009 16:24

Bonjour,

Je suis en train de développer une extension firefox et j'ai maintenant un problème avec le navigateur qui freeze.

J'ai en fait une fonction qui met plusieurs secondes à retourner une valeur

var result = myComponent.myFunction();
if(result ==1)
{
 ....
}

Pendant ce temps, l'interface utilisateur se gèle.

Afin d'éviter cela, il me faut lancer cette fonction dans un nouveau thread. Après quelques recherches, je suis tombé sur l'article Using workers in extensions

Cependant, mon javascript n'est pas codé selon la syntaxe objet JSON et j'ai du mal à voir comment je peux appliquer l'exemple à mon cas. La syntaxe JSON est elle indispensable à l'utilisation de workers ou de thread? Mon javascript est maintenant assez grand, j'espère ne pas y être obligé. Peut-on lancé une fonction d'un composant XPCOM dans un nouveau thread?

Aussi y a-t-il une différence entre un thread et un worker?

Merci d'avance pour votre aide

# Re: Browser freeze

Envoyé par : skuallpa

Date : 27/10/2009 14:39

J'ai trouvé la solution,

il faut lancer un thread en tache de fond de la manière suivante et ensuite attendre sa réponse dans le thread courant.

var thread, currentThread;
var complete = false;
var result = 0;
thread = Components.classes["@mozilla.org/thread-manager;1"]
        .getService(Components.interfaces.nsIThreadManager)
        .newThread(0);
currentThread = Components.classes["@mozilla.org/thread-manager;1"]
        .getService(Components.interfaces.nsIThreadManager)
        .currentThread;
var backgroundTask = {
         run: function() {
            result = myComponent.myFunction();
            complete = true;
         }
}
thread.dispatch(backgroundTask, thread.DISPATCH_NORMAL);
while(!complete){
         currentThread.processNextEvent(true);
 
}
//do something with result
... 
 

a plus

# Re: Browser freeze

Envoyé par : Grubshka

Date : 30/10/2009 13:15

Les web workers, c'est en fait des threads utilisables dans du code non privilégié (web). Ce qui ne t'empêche pas de les utiliser dans ton extension, mais ils ont en effet une syntaxe particulière.

Utiliser "directement" les threads me paraît une bonne idée dans ton cas, c'est plus souple à coder (à mon humble avis).

Attention, du coup, le code que tu mets dans un thread doit être "thread-safe" (par exemple pas d'accès au DOM, mais il y en a d'autres), sinon tu vas te retrouver avec des crashs de Firefox assez violents.

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.