OVH Cloud OVH Cloud

Protection de section critique en javascript

6 réponses
Avatar
Bertrand B
Bonjour,

Dans mon chtio bloque (=E7a c'est du teasing ;) ) je veux g=E9rer une pil=
e=20
FiFo avec un consommateur qui est d=E9clenc=E9 par onstatechange de=20
xmlHTPResquest et un fonrisseur qui est mon script principal.

Je suis donc dans une situation de /multit=E2che/.

J'ai besoin de prot=E9ger le Fifo pour qu'une lecture ne puisse avoir lie=
u=20
au milieu d'une =E9criture. Connaissez vous un moyen de protection des=20
sections critiques ?

existe t'il l'=E9quivalent d'une fonction sleep ?
(je rends la main pendant x seconde puis je reprends o=F9 j'=E9tais).

6 réponses

Avatar
O.L.
Il se trouve que Bertrand B a formulé :
Bonjour,

Dans mon chtio bloque (ça c'est du teasing ;) ) je veux gérer une pile FiFo
avec un consommateur qui est déclencé par onstatechange de xmlHTPResquest et
un fonrisseur qui est mon script principal.


C'est quoi une pile FiFo ? X-)

Je suis donc dans une situation de /multitâche/.

J'ai besoin de protéger le Fifo pour qu'une lecture ne puisse avoir lieu au
milieu d'une écriture. Connaissez vous un moyen de protection des sections
critiques ?


Moi j'utiliserais une variable qui prendrais une valeur quand une
écriture est en cours, et une autre valeur quand il n'y a pas
d'écriture en cours.

var locked = false;

// *** Lecture ***
// Ne rien faire tant que l'accès est occuppé
while(locked) {}
locked = true;
// le script de lecture ...
locked = false;

// *** Ecriture ***
Même chose.
A mon que 2 écritures puissent se faire en même temps ?

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net

Avatar
Olivier Miakinen

Dans mon chtio bloque (ça c'est du teasing ;) ) je veux gérer une pile FiFo
[...]


C'est quoi une pile FiFo ? X-)


C'est une file pipeau...



existe t'il l'équivalent d'une fonction sleep ?
(je rends la main pendant x seconde puis je reprends où j'étais).



Pas exactement, mais presque :
http://fr.selfhtml.org/javascript/objets/window.htm#set_timeout

La différence avec une fonction sleep(), c'est que ton script n'est pas
bloqué pendant l'attente. Il se termine donc si tu n'as plus rien à
faire, et c'est à toi de sauvegarder le contexte puisque, par exemple,
les variables locales à la fonction où tu étais n'existent plus.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
O.L.
Olivier Miakinen avait énoncé :

existe t'il l'équivalent d'une fonction sleep ?
(je rends la main pendant x seconde puis je reprends où j'étais).



Pas exactement, mais presque :
http://fr.selfhtml.org/javascript/objets/window.htm#set_timeout

La différence avec une fonction sleep(), c'est que ton script n'est pas
bloqué pendant l'attente. Il se termine donc si tu n'as plus rien à
faire, et c'est à toi de sauvegarder le contexte puisque, par exemple


Pour se rapprocher d'une fonction sleep(), on peut aussi bricoler un
truc du genre :

// usage : sleep(nbr de secondes);
function sleep(temps) {
t = new Date().getTime();
while(new Date().getTime()<t+temps*1000) {}
}

Mais bon, JS est pas fait pour ça et IE risque de nous faire des
misères en affichant une boite de dialogue, indiquant que le script
tourne en boucle, et proposant de l'arrêter ...

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net



Avatar
Bertrand B
Olivier Miakinen avait énoncé :




existe t'il l'équivalent d'une fonction sleep ?
(je rends la main pendant x seconde puis je reprends où j'étais) .




Pas exactement, mais presque :
http://fr.selfhtml.org/javascript/objets/window.htm#set_timeout

La différence avec une fonction sleep(), c'est que ton script n'est pas
bloqué pendant l'attente. Il se termine donc si tu n'as plus rien à
faire, et c'est à toi de sauvegarder le contexte puisque, par exempl e



Pour se rapprocher d'une fonction sleep(), on peut aussi bricoler un
truc du genre :

// usage : sleep(nbr de secondes);
function sleep(temps) {
t = new Date().getTime();
while(new Date().getTime()<t+temps*1000) {}
}

Mais bon, JS est pas fait pour ça et IE risque de nous faire des misè res
en affichant une boite de dialogue, indiquant que le script tourne en
boucle, et proposant de l'arrêter ...



Non pas bon ça la boucle active ... pendant ce temps l'utilisateur n'a
plus la main ... ce que je veux éviter.




Avatar
Bertrand B

Dans mon chtio bloque (ça c'est du teasing ;) ) je veux gérer une pile FiFo
[...]


C'est quoi une pile FiFo ? X-)



C'est une file pipeau...



Beuh non First In First Out ça s'appelle aussi un tampon





existe t'il l'équivalent d'une fonction sleep ?
(je rends la main pendant x seconde puis je reprends où j'étais).




Pas exactement, mais presque :
http://fr.selfhtml.org/javascript/objets/window.htm#set_timeout

La différence avec une fonction sleep(), c'est que ton script n'est p as
bloqué pendant l'attente. Il se termine donc si tu n'as plus rien à
faire, et c'est à toi de sauvegarder le contexte puisque, par exemple ,
les variables locales à la fonction où tu étais n'existent plus.



J'y ai pensé mais c'est pas simple du tout puiqu'avec set_timeout tu
introduit une rupture du fil de ton programme.
Par contre pour le problème des variable locale tu peux utiliser les
closures (je viens de les decouvrir).


function tache(par1,par2){
var par3="Quelquechose";

function declenchee{
alert(par.+par1+par2);
}
windows.setTimeout(declenche,5000);
}

tache("par1",5);



Avatar
Olivier Miakinen

[ pile FiFo ]


C'est quoi une pile FiFo ? X-)


C'est une file pipeau...


Beuh non First In First Out ça s'appelle aussi un tampon


Ça s'appelle aussi une file, mais certainement pas une pile (et je te
garantis que ce n'est pas du pipeau) !

D'ailleurs dans le langage courant tu as les files d'attente au
supermarché (FIFO) et les piles de plateaux à la cafétéria (LIFO).

http://fr.selfhtml.org/javascript/objets/window.htm#set_timeout


J'y ai pensé mais c'est pas simple du tout puiqu'avec set_timeout tu
introduit une rupture du fil de ton programme.


Non, ce n'est pas simple. Mais c'est le seul moyen pour éviter l'attente
active, alors il faut faire avec.

Par contre pour le problème des variable locale tu peux utiliser les
closures (je viens de les decouvrir).


Une autre solution consiste à mettre toutes les variables dont tu as
besoin dans un tableau associatif.


--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)