OVH Cloud OVH Cloud

Pourquoi ce script ne marche t'il pas ?

19 réponses
Avatar
ast
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);

while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY>
</HTML>

9 réponses

1 2
Avatar
Pascal
Le 22/12/2010 23:03, Newsreader a écrit :
Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.





Ok je vois, mais alors là c'est moi qui aimerais comprendre pourquoi
cette ligne rajoutée dans la fonction est bien exécutée ?


function Stop_() {
cond = false;


alert("coucou tout le monde !");
texte = texte + i;
document.formu.cadran.value = texte;
}




--
Cordialement,
Pascal
Avatar
SAM
Le 22/12/10 13:51, ast a écrit :
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>



Le script qui ne fonctionne pas et pourquoi
(un peu tardif car oublié d'être envoyé)

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);

while (cond) {
i++;
}



à partir d'ici, au chargement de la page, le JS va tourner fou
(le "while" n'ayant rien pour s'arrêter de boucler)
et donc la fonction Stop() ne sera même pas interprétée
Le JS étant monotâche il ne peut s'occuper du setTimeout pendant qu'il
s'évertue à utiliser à fond le CPU de l'ordi pour assurer le 'while' en
continu.

... non, de déclarer d'abord la fonction de stop
ne change rien à l'affaire
... il n'y a pas de temps laissé au timeout pour agir

je suis assez persuadé qu'un ordi portable finira par vrombir de ses
ventilos si on laisse le brouteur ouvert sur cette page
(et s'il n'arrête pas de lui-même la boucle)

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




--
Stéphane Moriaux avec/with iMac-intel
Avatar
Pascal
Le 22/12/2010 23:36, Pascal a écrit :
Ok je vois, mais alors là c'est moi qui aimerais comprendre pourquoi
cette ligne rajoutée dans la fonction est bien exécutée ?

function Stop_() {
cond = false;


alert("coucou tout le monde !");
texte = texte + i;
document.formu.cadran.value = texte;
}





Bon, faut être gentil avec moi, il est tard.
Alors, je retire ma question, car en fait la fonction n'est exécutée que
si on répond favorablement à la demande du navigateur pour interrompre
le script qui tourne en boucle (comme le propose élégamment Firefox).
Donc, si on arrête pas la boucle infinie, rien de ce qui suit n'est
exécuté (logique, jusque-là), pas mêmes les évènements en attente ou en
concurrence (peut-être mal formulé mais l'idée que je m'en fait).
Instructif...


--
Cordialement,
Pascal
Avatar
Newsreader
On 12/22/2010 11:36 PM, Pascal wrote:
Le 22/12/2010 23:03, Newsreader a écrit :
Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.





Ok je vois, mais alors là c'est moi qui aimerais comprendre pourquoi
cette ligne rajoutée dans la fonction est bien exécutée ?


function Stop_() {
cond = false;


alert("coucou tout le monde !");
texte = texte + i;
document.formu.cadran.value = texte;
}







En fait, le alert("coucou tout le monde !") ne s'exécute pas de manière
normale:

- sous chrome, le browser propose de "tuer la page" au bout de quelques
secondes. L'alert n'est pas exécutée.

- sous firefox, on peut appuyer sur le bouton "arrêter le script", ce
qui "débloque" la page et va exécuter l'alert. Deux explications à
ceci: la fonction Stop_ a été définie avant l'exécution du while
(principe du 'hoisting') et l'affichage de l'alert (à mon avis, pas sûr
sur ce point), est un comportement propre à firefox qui effectue une
sorte de "purge" des events qui restaient à exécuter avant le blocage du
script.

ps: commentaires valables sur mon système (ubuntu); pas testé sous
windows ou mac.
Avatar
Mickaël Wolff
On 22/12/10 21:51, Newsreader wrote:
- OK avec toi pour dire que la méthode que je propose n'est pas valable
pour un test de performance exactement pour les raisons que tu évoques
(opérations 'connexes' au sein de la boucle); c'était juste pour donner
un exemple "quick and dirty" de la fonctionalité.



J'aime pas le Q&D ;)

- La raison pour laquelle cond n'est jamais mise à false : pour le
comprendre, il faudrait déjà commencer par comprendre la nature de
javascript ...

Contrairement à d'autres langages qui sont "multi-tâches", javascript
est un langage interprété "mono-tâche" (single-threaded). Pour faire
simple, l'interpreteur n'execute qu'une seule instructtion à la fois et
de manière séquentielle au cours d'une "boucle d'évènements" (event
loop). Les actions "asynchrones" comme les callback et les timers sont
aussi exécutées de manière séquentielle, c'est à dire lorsque
l'instruction précédente est terminée.

Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.

Voilà ce que, avec ma très faible connaissance du sujet, je voulais dire
en faisant allusion au "script" de javascript. Mais je n'apprend sans
doute rien à un expert comme toi.



Je n'ai jamais rencontré de documentation qui mentionne se
fonctionnement. Si tu as un lien vers une source qui explique ce
fonctionnement, je suis preneur. Parce que j'ai eu bon parcourir le
standard d'Ecmascript et tenté de Googler, je ne suis pas tomber sur
quelque chose de pertinent. Ceci dit, ce que tu décris expliquerais bien
pourquoi cond n'est pas mis à jour pendant que la boucle est exécutée.
Avatar
NewsReader
On 12/23/2010 12:33 AM, Mickaël Wolff wrote:
On 22/12/10 21:51, Newsreader wrote:
- OK avec toi pour dire que la méthode que je propose n'est pas valable
pour un test de performance exactement pour les raisons que tu évoques
(opérations 'connexes' au sein de la boucle); c'était juste pour donner
un exemple "quick and dirty" de la fonctionalité.



J'aime pas le Q&D ;)

- La raison pour laquelle cond n'est jamais mise à false : pour le
comprendre, il faudrait déjà commencer par comprendre la nature de
javascript ...

Contrairement à d'autres langages qui sont "multi-tâches", javascript
est un langage interprété "mono-tâche" (single-threaded). Pour faire
simple, l'interpreteur n'execute qu'une seule instructtion à la fois et
de manière séquentielle au cours d'une "boucle d'évènements" (event
loop). Les actions "asynchrones" comme les callback et les timers sont
aussi exécutées de manière séquentielle, c'est à dire lorsque
l'instruction précédente est terminée.

Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.

Voilà ce que, avec ma très faible connaissance du sujet, je voulais dire
en faisant allusion au "script" de javascript. Mais je n'apprend sans
doute rien à un expert comme toi.



Je n'ai jamais rencontré de documentation qui mentionne se
fonctionnement. Si tu as un lien vers une source qui explique ce
fonctionnement, je suis preneur. Parce que j'ai eu bon parcourir le
standard d'Ecmascript et tenté de Googler, je ne suis pas tomber sur
quelque chose de pertinent. Ceci dit, ce que tu décris expliquerais bien
pourquoi cond n'est pas mis à jour pendant que la boucle est exécutée.



Ecmascript ...

Citation: 'Dans le monde, il y a deux types de personnes qui lisent la
spécification Ecmascript: ceux qui connaissent JavaScript sur le bout
des doigts et espèrent y découvrir quelquechose qu'ils ne connaitraient
pas encore, et ceux qui ne connaissent rien à JavaScript et espèrent y
retrouver quelquechose qu'ils connaissent déjà."

Sans vouloir t'offenser, j'ai l'impression qu'il y a beaucoup plus de
chances pour que tu fasses partie de la deuxième catégorie que de la
première ...

Je te conseillerais donc de remettre les specs Ecmascript dans un
placard et de réorienter tes lectures vers des ouvrages qui te seront
vraiment utiles pour apprende le langage : "JavaScript pour les nuls"
(280 pages, Editions First) serait peut être un bon début.
Avatar
ast
"NewsReader" a écrit dans le message de
news:4d124d7b$0$1588$


Ca ne marche pas parce que tu ne ressort jamais de la boucle
while(cond) { i++; } puisque cond est toujours true.



Ben à 10 ms, il y a la fonction Stop_ qui devrait se déclencher



Je crois que cette logique serait valable dans d'autres langages comme Java par exemple.




oui

ça marcherait sur un processeur qui exécuterait en programme
principal la boucle:

main() {
while (cond) {i++;}
}

et avec un programme d'interruption:

Stop () {
cond = false;
}

qui serait déclenché par un timer "hardware" programmé par:

setTimeout("Stop();",10);
Avatar
Mickaël Wolff
On 23/12/10 09:54, NewsReader wrote:
Citation: 'Dans le monde, il y a deux types de personnes qui lisent la
spécification Ecmascript: ceux qui connaissent JavaScript sur le bout
des doigts et espèrent y découvrir quelquechose qu'ils ne connaitraient
pas encore, et ceux qui ne connaissent rien à JavaScript et espèrent y
retrouver quelquechose qu'ils connaissent déjà."


Citation de qui ?


Je te conseillerais donc de remettre les specs Ecmascript dans un
placard et de réorienter tes lectures vers des ouvrages qui te seront
vraiment utiles pour apprende le langage : "JavaScript pour les nuls"
(280 pages, Editions First) serait peut être un bon début.


Si c'est ça ta référence, j'aurais du mal à prendre au sérieux le
moindre de tes dires.
Et j'attends toujours une source de ce que tu avances. Pour ma part,
j'ai trouvé quelque chose qui va dans ton sens. Ceci dit, l'auteur
précise bien que ça concerne les implémentations côté client de
Javascript :
http://books.google.ie/books?id=2weL0iAfrEMC&lpg=PT277&ots=_82znxW-bG&dq=client%20side%20javascript%20threading%20model&pg=PT277#v=onepage&q=client%20side%20javascript%20threading%20model&fúlse
Mais ça ne me convient pas, ça ne fait pas référence à une autre
documentation qui ferait autorité (comme une spécification).
Avatar
SAM
Le 25/12/10 20:44, Mickaël Wolff a écrit :
On 23/12/10 09:54, NewsReader wrote:

Je te conseillerais donc de remettre les specs Ecmascript dans un
placard et de réorienter tes lectures vers des ouvrages qui te seront
vraiment utiles pour apprende le langage : "JavaScript pour les nuls"
(280 pages, Editions First) serait peut être un bon début.


Si c'est ça ta référence, j'aurais du mal à prendre au sérieux le
moindre de tes dires.
Et j'attends toujours une source de ce que tu avances. Pour ma part,
j'ai trouvé quelque chose qui va dans ton sens. Ceci dit, l'auteur
précise bien que ça concerne les implémentations côté client de
Javascript :
http://books.google.ie/books?id=2weL0iAfrEMC&lpg=PT277&ots=_82znxW-bG&dq=client%20side%20javascript%20threading%20model&pg=PT277#v=onepage&q=client%20side%20javascript%20threading%20model&fúlse



Ça dit, comme tout le monde le sait :
« Client-side JavaScript is single-threated. »
et ... c'est bien ce qui nous intéresse ici dans le cas de cette boucle
sans fin qui n'autorise pas d'autre action de la part du script en cours

Mais ça ne me convient pas, ça ne fait pas référence à une autre
documentation qui ferait autorité (comme une spécification).



Sans vouloir offenser personne
ni conseiller les nuls ou O'Reilly ou l'imbuvable "norme",
considérant que le JavaScript du brouteur est monotâche,
le bon sens devrait alors suffire à comprendre ce qu'il se passe.


Outre des "spécifications officielles et générales" il y a celles
propres à chaque navigateur.
Par exemple chez Mozilla on pourra se pencher sur :
<https://developer.mozilla.org/en-US/search?q=single+thread>

On pourra aussi parcourir la FAQ :
<http://jibbering.com/faq/>
<http://jibbering.com/faq/#ecmascriptResources>
qui donne des pistes pour des normes.

--
Stéphane Moriaux avec/with iMac-intel
1 2