Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction
Faculté I&C, Claude Petitpierre, André Maurer Evénement chaînés onload="f()" f() { } setTimeout(f, 100) f() { } setTimeout(f, 100) f() { } setTimeout(f, 100)
Faculté I&C, Claude Petitpierre, André Maurer Evénement chaînés ( setInterval() ) onload="setInterval(f, 100)" f() { } } }
Faculté I&C, Claude Petitpierre, André Maurer this.f ? On ne peut pas chaîner les méthodes dun objet de la même façon obj = { f : function() { } x : 15 } setTimeout(this.f, 100) f() { } this.x ? moteur setTimeout(this.f, 100) this.x Possible this est perdu !
Faculté I&C, Claude Petitpierre, André Maurer Closures Le chaînage des appels doit être fait par closure ! Une closure = une fonction + attributs + son environnement de variables locales Toute fonction définie à lintérieur dune autre fonction produit en fait une closure Sorte de mini-objet
Faculté I&C, Claude Petitpierre, André Maurer Closure var x = null function createClosure (arg) { var vLocale = 10 x = function uneClosure(a) { // fonction définie dans alert(vLocale + a + arg) // une autre fonction }... createClosure(45) x(22)
Faculté I&C, Claude Petitpierre, André Maurer Closure Autre façon dy accéder function createClosure (arg) { var vLocale = 10 return function uneClosure(a) { alert(vLocale + a + arg) }... var x = createClosure(45) x(22)
Faculté I&C, Claude Petitpierre, André Maurer Closure function createClosure (arg) { var vLocale = 10 return function uneClosure(a) { alert(vLocale + a + arg) } 1.Même après la fin de createClosure, lenvironnement contenant les variables locales de cette fonction sont gardées et restent accessibles dans la fonction uneClosure. 2.Si lon crée deux closures dans la même fonction (même appel), elles partagent le même environnement (qui est celui de la fonction englobante) 3.Si la fonction est définie dans un objet, les attributs de l'objet font partie de la closure
Faculté I&C, Claude Petitpierre, André Maurer Closure dans un appel à setTimeout function createClosure (arg) { var vLocale = 10 setTimeout( function uneClosure() { alert(vLocale + arg) }, 1000) }
Faculté I&C, Claude Petitpierre, André Maurer Closure dans un appel à setTimeout function createClosure (arg) { var vLocale = 10 function xxx() { alert(vLocale + arg) } setTimeout( xxx, 1000) }
Faculté I&C, Claude Petitpierre, André Maurer Animation dans un objet var activeObj = { couleur : "green" run1 : function() { alterneCouleur(this.couleur) var that = this // that est un nom arbitraire clos = function() { that.run2() } setTimeout( clos, 500 ) }, run2 : function() { alterneCouleur("red") var that = this setTimeout( function() { that.run1() }, 500 )}
Faculté I&C, Claude Petitpierre, André Maurer Une autre possibilité de définir la séquence var activeObj = { etat : 0, run : function() { switch (etat) { case 0: alterneCouleur("green") etat = 1 break case 1: alterneCouleur("red") etat = 0 break } var that = this setTimeout( function() { that.run() }, 500)}
Faculté I&C, Claude Petitpierre, André Maurer Threads La séquence ininterrompue dappels par timeout constitue le fil (de lhistoire), en anglais thread. Si lon crée plusieurs objets de ce type, on pourra garder plusieurs fils actifs indépendants. Un thread est un moyen de suivre plusieurs activités sans les mélanger. Ce concept est à la base de la programmation pseudo- parallèle. Java, C++… offrent des moyens pour créer des threads. En C++, ils ne sont pas liés à un objet. Dans ces langages, le fil peut être commuté à tout instant, pas seulement entre les fonctions. Exemple
Faculté I&C, Claude Petitpierre, André Maurer Au moyen dun constructeur function Actif () { var etat = 0 var that = this <<<<<< this.couleur = "green" this.run = function() { switch (etat) { case 0: alterneCouleur("green") etat = 1 break case 1: alterneCouleur("red") etat = 0 break } setTimeout( function() { that.run() }, 500)}
Faculté I&C, Claude Petitpierre, André Maurer Extension de Javascript (Compilateur + librairies de LemanOS) process XYZ (nom) { this.run() { for (;;) { waituntil(now() ) }
Faculté I&C, Claude Petitpierre, André Maurer Suspension dans un "thread" process Runner() { this.run = function() { if (x>0) waituntil(now()+10) x = 10 } x=0 }
Faculté I&C, Claude Petitpierre, André Maurer Découpage par le compilateur this.run = function() { for(;;) { switch(_state) { case 10000: if (x>0) { if (!(x>0)) {_state=10002;break} _state = waituntil(now()+10) setTimeout(that.run, 10)return case 10001: x = 10 } case 10002: x=0 x = 0 break } } }} compilation
Faculté I&C, Claude Petitpierre, André Maurer Appel d'un objet avec thread... p1 = new XYZ() p1.meth()... process XYZ (nom, p1) { this.meth = function() { } this.run() { // boucle infinie for (;;) {... accept meth }
Faculté I&C, Claude Petitpierre, André Maurer Synchronisation entre objects rendez-vous process ABC (nom, p1) { this.run() { for (;;) { waituntil(now() ) p1.meth() }}} process XYZ (nom, p1) { this.meth = function() { } this.run() { for (;;) { accept meth }}}
Faculté I&C, Claude Petitpierre, André Maurer Attentes concurrentes this.run(nom) { select { case p1.m1() case p2.m2() } this.m1 = function()( { } this.run(nom) { select { case accept m1 case p2.m2() } this.m2 = function()( { } this.run(nom) { select { case accept m2 } Trois rendez-vous possibles
Faculté I&C, Claude Petitpierre, André Maurer kernel.js prêts rendez-vous délais
Faculté I&C, Claude Petitpierre, André Maurer Oiseaux passant par un couloir Programme Programme process Oiseau() { this.run = function() { for(;;) { // avant le couloir couloir.entrer() // avancer dans le couloir couloir.sortir() // après le couloir } } } process Couloir() { this.entrer() { } this.sortir() { } this.run = function() { for(;;) { accept entrer accept sortir } } }
Faculté I&C, Claude Petitpierre, André Maurer select avec toutes les possibilités select { case when (i==0) x = proc.meth() x = x + 1 case when (y>0) accept m2 case when (y<0) waituntil(now() ) }
Faculté I&C, Claude Petitpierre, André Maurer Boîte aux lettres // quoi process Poste(nom) { this.fifo = [ ] this.deposer = function (paquet) { this.fifo.push(paquet) } this.prendre= function () { return this.fifo.shift() }... // quand... this.run = function () { for (;;) { select { case accept deposer case when (this.fifo.length>0) accept prendre } waituntil(now()+400) } } } Programme 1 Programme 2