Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Thread javascript

Il est souvent utile de pouvoir éxecuter un long script en tâche de fond, de manière à ce que l'interface utilisateur reste utilisable (sinon elle "freeze").

Il est possible d'utiliser alors des threads, qui effectueront ce traitement. Mais attention, ce traitement ne doit pas faire appel à des variables ou des objets qui sont instancié en dehors de ce traitement. On ne peut pas en particulier faire appel à l'objet document ou à des composants "services", pour modifier par exemple en tâche de fond l'interface. Si cela est indispensable, il faut passer par des "objets proxys", ce qui necessite de développer l'objet implementant l'interface nsIRunnable, non pas en javascript comme indiqué en dessous, mais en C++. (Voir Thread).

NOTE, AVERTISSEMENT : en fait il semble possible de faire des objets proxys en javascript. Et donc de se passer de C++. ToDo : mettre à jour la page

Utilisation de base

Le principe est d'utiliser le composant @mozilla.org/thread;1, en lui donnant un objet respectant l'interface nsIRunnable. Cet objet contiendra le traitement à effectuer en tâche de fond. Par exemple :

 var runnable = {
   run: function() {
     // ici votre traitement
   }
 }

Ensuite vous faîtes appel au service de thread :

 // instanciation
 var thread = Components.classes["@mozilla.org/thread;1"]
  .getService(Components.interfaces.nsIThread);
 // lancement du process
 thread.init(runnable,512*1024,
	Components.interfaces.nsIThread.PRIORITY_NORMAL,
	Components.interfaces.nsIThread.SCOPE_GLOBAL,
	Components.interfaces.nsIThread.STATE_UNJOINABLE);

La méthode init prend quatre arguments : # l'objet nsIRunnable que vous avez implémenté # la taille de la pile # la priorité, qui doit valoir une des valeurs : PRIORITY_LOW, PRIORITY_NORMAL, PRIORITY_HIGH, PRIORITY_URGENT # le scope : SCOPE_LOCAL, SCOPE_GLOBAL, SCOPE_BOUND # le "state" : STATE_JOINABLE ou STATE_UNJOINABLE

(À faire : expliquer ces valeurs)

Comme votre composant nsIRunnable est implémenté en Javascript, et comme il est précisé plus haut, le traitement que vous effectuez doit être totalement autonome et ne doit pas faire appel a des objets exterieurs à votre fonction run().

Note, AVERTISSEMENT : ceci n'est pas vrai apparement. ToDo : mettre à jour la page

Utiliser des observateurs

Il est utile parfois d'être informé de la progression du traitement, de la fin du traitement etc.. Pour cela, on peut utiliser des observateurs.


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.