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) onload="setInterval(f, 100)" f() { } } }
Faculté I&C, Claude Petitpierre, André Maurer this.f ? Problème lors du chaînage de la méthode dun objet 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 + son environnement de variables locales Toute fonction définie à lintérieur dune autre fonction est en fait une closure Sorte de mini-objet 1
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, elles partagent le même environnement (qui est celui de la fonction englobante)
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 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 Synchronisation entre objects rendez-vous process XYZ (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