UNE FONCTION QUI DORT ======> SLEEP( SECONDE );

FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008 - 15 déc. 2006 à 15:01
Eregon Messages postés 17 Date d'inscription lundi 3 septembre 2007 Statut Membre Dernière intervention 26 octobre 2009 - 3 sept. 2007 à 18:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40734-une-fonction-qui-dort-sleep-seconde

Eregon Messages postés 17 Date d'inscription lundi 3 septembre 2007 Statut Membre Dernière intervention 26 octobre 2009
3 sept. 2007 à 18:33
Mon problème est qu'en fait j'ai une boucle basée sur les degrés de rotation. Voici le code,ce sera plus simple:

deg=valeur d'un degré
rotation = cmb de degrés de l'angle ont été faits

function rotate(sens)
{
for( var rotation = 0; rotation <= angle; rotation += deg )
{
//modification des attributs top et left des images avec comme parametre externe: rotation(pour els fonctions sin et cos)
->>>sleep(250);//la j'aimerait attendre environ .25s ou 250ms
}


}
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
3 sept. 2007 à 18:23
pour arrêter un timer, il faut faire clearInterval(timerID).
pour empêcher une exécution décalée, il faut faire clearTimeout(timerID)

timerID est la valeur de retour de setInterval/setTimeout
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
3 sept. 2007 à 18:21
setInterval(function() {
// Cette fonction se lance toutes les {nbSeconde} seconde(s).
}, nbSeconde * 1000)

setTimeout(function() {
// Cette fonction se lancera une seule fois dans {nbSeconde} seconde(s).
}, nbSeconde * 1000)

Tu peux aussi faire setTimeout(uneFonction, nbSeconde * 1000)
Eregon Messages postés 17 Date d'inscription lundi 3 septembre 2007 Statut Membre Dernière intervention 26 octobre 2009
3 sept. 2007 à 18:12
Voici un autre exemple pour la fonction sleep:

Dans le cadre d'une modification de place des images, il peut-être utile d'attendre un peu sinon on arrive directement au résultat et le client ne voit pas l'effet...

J'ai lu le topic mais je ne comprends pas bien les fonctions setInterval() et setTimeout().

Si qqn voulait bien faire la fonction sleep avec une de ces fonctions,j'en serait grandement reconnaissant...

Pour info, je fait une rotation d'images autour d'un point et il faut donc attendre entre chaque degré de rotation pour voir l'effet.
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
1 avril 2007 à 17:13
effectivement... j'avais pas pensé
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
1 avril 2007 à 12:54
VBScript = IE-Only = Mauvaise solution :(
stfou Messages postés 450 Date d'inscription samedi 16 avril 2005 Statut Membre Dernière intervention 18 avril 2007 3
31 mars 2007 à 22:26
La fonction sleep existe-t-elle en vbscript ? Parceque on peut transférer les objets javascripts en vb et inversement (voir ma source)
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
27 déc. 2006 à 13:13
3) C'est pas toujours possible
Un exemple comme ca :

Sur un event onsubmit, je voudrais demander à l'utilisateur de valider ses données en affichant une fenêtre dans laquelle je puisse mettre du HTML et permettre à l'utilisateur de valider (return true;) ou refuser (return false;)...

Comment tu veux faire avec une fenêtre ouverte + abonnement aux events ?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 20:43
Pour la précision, toutes les fenêtres n'auront pas se comportement la :
"J'aimerais que mes fenêtres" ===> "J'aimerais que certaines de mes fenêtres"
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 20:41
Ben en fait je compose (tu sais pour mon API JS) un gestionnaire de fenêtre (style youOS, JSWin, ...) "windows-like"...

J'aimerais que mes fenêtres puissent demander à l'utisateur de faire un choix et qu'elles bloquent le thread qui a ouvert la fenêtre tant qu'aucune réponse n'a été fournie (comme prompt, alert sous IE, confirm, ...)

Ainsi, on peut changer les icones, ... et personnaliser la fenêtre...

Sans sleep, c'est impossible.

Et ouvrir une fenêtre modal et s'abonner à ses events :
1) C'est plus long à coder
2) On peut moins personaliser (mettre la barre de titre au couleurs du site, ...)
3) C'est pas toujours possible
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 20:34
He he, ben depuis que c'est "dangereux" ;)
<<[[
IE7 and the JavaScript Prompt

IE7 has shipped and its probably (by and large) a decent browser now. But of course it wouldn't be Microsoft if they didn't mess up something. First in what will probably be a long line of security related "features", Microsoft have decided to modify the way that the good old JavaScript prompt works.

The reason? Phishing sites impersonating or even superimposing themselves on real web sites were using the prompt to lure gullible users into providing credit card numbers, passwords and all sorts of powerful data. So now whenever a web page wants to use a prompt you have to click on the unnoticeable security bar at the top of the browser and "allow" temporary access. To make matters worse the prompt presented is ugly and out of place.

I'm not saying that a prompt is the best way to ask the user for data, but given the whole Web 2.0 movement there are numerous occasions where the prompt is a useful and elegant solution to on-the-fly input. The worst part is that the unscrupulous underbelly of the internet will end up using a modal window or a clever floating div about 15 seconds after they realize their old technique doesn't work and then who loses? Why, the web 2.0 programmer that thought a JavaScript prompt was a no-brainer in terms of cross-browser support.

Phishing works because people are stupid, making your browser idiot-proof is a surefire way to drive yourself crazy.

Score one for stupidity.
]]>>
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
26 déc. 2006 à 19:23
prompt marche pas par défaut sous IE7 ??? ah bon et depuis quand ?

Pour ton histoire de fenêtre modal, j'ai rien compris ! D'accord sous FF la fonction alert ne block pas le thread mais qu'est-ce qui t'empeche, comme tu le dis, de coder une fonction modalPopup et de t'abonner à des events ?

Pour ce qui est des limitation il me semble qu'un navigateur ne peut ouvrir que 4 connexions au total par domaine : 1 fichier HTML, 2JS, 1 CSS, et ne peut faire que 2 XHR. C'est en grande partie l'experience qui me dit ça donc je sais pas si c'est vrai pour tous les navigateurs et s'il y a une référence la dessus ...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 19:10
L'exemple de remplacement de alert est d'autant plus judicieux que prompt ne marche plus (par défaut) sous IE 7 ;)
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 19:06
Pas bête l'histoire du abort... ca marche avec tous les navigateurs ?

-----------------------
Quelle est cette histoire de limite de XHR ?
C'est réel ? J'avais jamais lu ca moi...

---------------------
Oui, j'ai des exemples ;)
Imaginons que je veuilles remplacer la méthode alert par une fonction au fonctionnement similaire (thread blocé tant que l'utilisateur n'a pas répondu) je n'ai pas d'autre choix de de faire un while portant sur la fermeture de ma div "WebForm" ==> Ca bouffe tout le CPU ==> L'utilisateur sait pas cliquer sur OK ==> Ca marche pas...

Avec sleep, je peux faire while (xxx) { sleep (1000); } et ainsi bloquer le thread tout en permettant à l'utilsateur de répondre !

Et ainsi tu peux faire des boites de dialogues "modales" personalisées de tout type (Retry - Ignore - Cancel, OK - Cancel, YES-NO, ...)

Enfin, c'est un exemple comme ca ;)

Autre idée, si on veut charger une iframe, et bloquer un thread tant qu'elle est pas chargée (ou arrêtée) (ou, pour si on ne détecte pas l'erreur plus de X seccondes), sans sleep, c'est impossible...

Sinon, en effet, il faut mieux se passer de sleep si besoin (d'ailleurs avant je l'avais pas et j'ai bien fait sans !)
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
26 déc. 2006 à 18:48
Et pourquoi ne pas tout simplement utiliser la méthode abort de l'objet XMLHttpRequest ?

En gros ca donne ça (j'écrit directement le code, je test pas ! :p)

var sleep = function(milliseconds){
var xhr = createXHR();
xhr.open("GET","/JS/wait.aspx?ms="+milliseconds,false);
window.setTimeout(function(){
xhr.abort();
}, milliseconds);
xhr.send(null);
}

Je pense que ca devrait fonctionner, bien sur faudrais mettre ca dans un objet pour avoir un pool de requete "wait" etc, ...

Côté serveur on envoit quand même le temps du wait même si le client n'attendra pas sa réponse ... on pourrais aussi mettre un temps d'attente "infini" mais inutile de bouffer des ressources inutilement :-) Pour ASP.net on pourrait utiliser les Pages Asynchrone histoire de pas bouffer un thread du pool d'application pour rien ;-)


Mais c'est une MAUVAISE approche, le client ne peut faire que 2 requêtes XHR à la fois si on fait 2 wait on ne pourra plus faire un vrai XHR avant que le premier wait soit finit ... c'est donc une très mauvaise approche que je n'utiliserais jamais ! Je ne vois aucun interêt à réinventer la méthode sleep, dans la vrai vie elle ne sert jamais (à part pour le debug) settimeout est beaucoup plus utile vu qu'il ne bloque pas le "thread" courant ...
Si quelqu'un a un exemple concrêt de l'utilisation de la méthode sleep (à part pour du debug) je suis preneur :-)
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 18:24
Lol, ben moi je suis bien content avec mon :
<<[[
Dim Time As Integer = CInt(Request("time")) - 500
If Time < 0 Then Time = 0
]]>>

On enlève 500 ms pour la requête et à moins que celle-ci ne dure moins de 250 ms, on ne risque pas d'avoir de nouvelles requetes ;)

Evidemment, si qqun a envie de modifier le script, je laisse faire xD
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
26 déc. 2006 à 18:09
Effectivement,
il faudrait aussi prendre en compte le fait que la requete revient
on pourais faire comme ceci :

* Client : Prise de la date présisément
* Client : Envoya la requete avec la date prise et le temps du sleep()
et attend la réponse....

* Serveur : Calcule le temps restant a attendre,
en fonction de la variable sleep et aussi du temps de la requete,
spécifier par le Client ( date ) [ Le Serveur le calcule ]
* Serveur : Fait attendre ( x ms ).....
* Serveur : Retourne un caractère signifiant que la requete c'est bien effectuer

* Client : ....Fin ( Aprés que le caractère de confirmation ai bien été recu )



Sa tente quelqu'un sa...?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 17:41
Intéressant, mais il faudrait peut-être penser au fait que la requête part... mais revient aussi ;)
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
26 déc. 2006 à 16:52
Pour règler le fait que certaine personne on une connection plus lente voici une petite modification qui fonctionnerait mieux, car il tiendrait compte de quand est parti la requête de sleep.

<script type="text/javascript">
function sleep (timeToWait)
{
time = new Date().getTime()+timeToWait;
...
On fait la requête.
...
}
</script>

<?php
$toWait = $_GET["time"]-time();
if ($toWait < 0)
die("");

sleep($toWait);
?>
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
26 déc. 2006 à 14:48
Joli geste,
je vais faire comme tu ma di,
j'édite ma source en remplaçant le contenue,
et surtous j'indiquerais de qui est la source....
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 14:15
Ne serait-ce pas plus simple que tu édite la tienne de manière à proposer les deux solutions ? Ca va plus vite que tout reposter et surtout ca ferait doublon, tu ne penses pas ?

Tu sais, je suis pas du genre à poster une source juste pour que mon compteur de sources augmente ;)

C'est toi qui a initié le mouvement, tu peux disposer à ta guise de ma source ;)

De toute facon, maintenant qu'elle est mise dans les commentaires, elle peut être trouvée par n'importe qui qui cherche bien ;)
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
26 déc. 2006 à 13:45
Oui bof sa doit venir de moi sa je crois,
tros tros d'application en même temps,
donc faut pas sens faire...

Donc en gros cette solution est potable....
Et peux etre utilisé par les serveurs sous Asp et Php ^^
A exploiter donc, tu peux la formuler et la poster en source,
pour quoi pas, tu le poste en source javascript,
mais qui conserne aussi le php / Asp pourquoi pas....
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
26 déc. 2006 à 12:33
Oui, en effet ;)
Et tu dis que ca plante dans 90% des cas ???
Chez moi je n'ai eu aucun problème...
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
26 déc. 2006 à 03:12
Cher moi sa a crasher dans 90% des cas lol,
mais sinon au nivo de temps c'est casiment exacte,
il n'y pas une grosse différence....

bon sa peux etre effectivement une solution, pourquoi pas,
mais il faudrait créer des systemes de vérifications,
parce que, sinon nimporte quel idio pourra utiliser la fonction sleep()
du serveur concerné a partir de nul part, se qui pourait le faire saturé....
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
25 déc. 2006 à 20:58
Pour le Php sa doit pas etre tros différent,
je vais voir en combient de temps,
et je le communique,
mais sa doit pas etre trés différent a mon avie,
de rien pour la version php....

je fais les testes et je le poste ici....
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 20:15
Au fait, merci pour la version PHP !!
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 20:15
La variation sera courte, vu qu'il n'y a que les headers à transmettre !

Dans ma version ASP .Net, je vide tous les headers à la fin, ce qui fait qu'il ne reste que le strict minimum à transmetre... Et le temps de connection est comptabilisé dans la version .Net car je soustrait 500 à time (mais je ne sais pas suffisement PHP pour me risquer à faire des opartions complexes comme la modification des headers, la conversion de données, ...).

Deplus, comme je l'ai dit, pour les sleep de moins de 250 ms, il n'y a pas de requête...

Et chez moi, selon mes test, ca marche très bien... Evidement, on ne peut pas en jurer pour tout le monde (connection lente)
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
25 déc. 2006 à 17:32
Ouai a vu de nez sa peux etre une solution mais
il reste toujours un inconvénient, parseque comme tu la di,
sa dépend de la connection de chaqun,
en gros il y aura le sleep demander + le ten de la requete
( qui peut varié énormément selon les connections )

Donc dans certain cas sa peux donner des résultats
largement plus long...

P.S.:

<?Php

if( isset( $_GET[ 'time' ] ) && is_numeric( $_GET[ 'time' ] ) )
{
sleep( $_GET[ 'time' ] );
}
?>
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 17:12
Finalement j'ai trouvé mieux...
Plutot que de mettre une taille à un fichier, ce qui est dangereux car la vitesse de transfert peut varier d'une connection à l'autre (et donc le temps d'un XHR), j'ai décidé d'appeler, via xhr, le sleep du langage serveur !

Bien sur, si le temps demandé à sleep est faible (moins de 250 ms), alors il n'y a aucun intérêt à faire un requete au serveur, j'ai donc mis cette limitation.

SLEEP.HTML
<<[[
<html><script>//<!--
/** This code is a part of Prototype 1.4 for FC Web API 3.0 **/

// Renvoie le texte de l'objet ActiveXObject le plus récent depuis une liste
var pickRecentProgID = function (idList){
// found progID flag
var bFound = false;
for(var i=0; i < idList.length && !bFound; i++){
try{
var oDoc = new ActiveXObject(idList[i]);
o2Store = idList[i];
bFound = true;
}catch (objException){
// trap; try next progID
};
};
if (!bFound)
throw ("Aucun ActiveXObject n'est valide sur votre ordinateur, pensez à mettre à jour votre navigateur");
idList = null;
return o2Store;
}

// Retourne un nouvel objet XmlHttpRequest
var getXmlHttpRequest_AXO=null
var getXmlHttpRequest=function () {
if (window.XMLHttpRequest) {
return new XMLHttpRequest()
}
else if (window.ActiveXObject) {
if (!getXmlHttpRequest_AXO) {
getXmlHttpRequest_AXO=pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
}
return new ActiveXObject(getXmlHttpRequest_AXO)
}
return false;
}

// Compatibilité au tutoriel
getXhr=getXmlHttpRequest;

function sleep(ms) {
var startDate=new Date()
var i=0; var e=0; var time=0;
while (time < ms) {
try {
if ((ms-time) > 249) {
var xhr=getXhr();
xhr.open("GET","/JS/wait.aspx?date=" + escape (new Date()) + "&time="+(ms-time),false);
xhr.send(null);
i++;
}
} catch (ex) { e++; }
time = new Date().getTime() - startDate.getTime()
}
document.write(i + " appels XHR pour une durée totale de " + time + " ms.
");
}

sleep(5000);
sleep(100);
sleep(1);

//--></script></html>
]]>>

Et WAIT.ASPX
<<[[
<%@ Page Language="VB" %>
<%
Dim Time As Integer = CInt(Request("time")) - 500
If Time < 0 Then Time = 0
Threading.Thread.Sleep(Time)
Response.ClearHeaders()
%>
]]>>

Pour PHP (que quelqu'un qui connaisse PHP valide ce que j'ai tapé)
<<[[
<?
$time = $_GET["time"];
sleep($time)
>
]]>>
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 16:34
Par contre après test :
- si le fichier n'existe pas, ca ne marche pas (la requête va trop vite)
- si le fichier est trop petit, pareil
- si le fichier est trop grand, le temps de sleep pourrait être faussé, je vais faire des recherches pour savoir quelle taille adopter...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 16:13
Oui, c'est évident... Mais qui utilise encore IE 5 ? FireFox 0.x ?
Le seul cas que je vois c'est Opéra 8, qui a peut-être encore des utilisateurs, vu que je ne crois pas que la mise à jour étaient proposée automatiquement (ou c'est moi qui ait installé OPERA 9 avant qu'on ne me propose celle-ci ?)
D'un autre coté, c'est vraiment minoritaire et négligeable...
Quand on pense au nombre de site qui utilisait déjà AJAX alors que seul IE était compatible... Il faut mettre à jour son navigateur ou subir les inconvénients...
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
25 déc. 2006 à 14:34
Oui effectivement mais apres sa depent de la version,
si je me trompe pas toutes les versions
ne prennent pas en compte Ajax....?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 12:10
Je crois qu'aujourd'hui tous les navigateurs un tant soit peu utilisés sont compatibles AJAX ;)
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
25 déc. 2006 à 12:03
IE et Mozilla peuvent tous les deux faire de l'AJAX...

La dernière version d'OPERA le fait aussi, et il me semble que les navigateurs basé sur KHTML (linux) en sont capables aussi...

Safari prend lui aussi en charge AJAX.

Quel navigateur reste-t-il ?
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
24 déc. 2006 à 23:45
Ta proposition pour la solution avec ajax,
est aléchante, mais maleureusement inadapté,
le but serai de trouver un facon de faire passienter,
tous le monde, quelque soit le navigateur [ IE, MOZILLA, ... ]
tant qu'il est évoluer ( pas quand mode texte )
et non d'exclure une partis d'entre eux...

Mais maleureusement je ne vois pas de solution :(
Quelqu'un aurait une solution....?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
24 déc. 2006 à 20:05
J'y avais pensé, mais je ne l'ai pas indiqué :

Pour eux, ben le CPU sera au max hélas... A moins que vous ne voyez une autre solution ?

try {
// AJAX Stub
} catch (ex) {}
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
22 déc. 2006 à 20:12
Et pour ceux qui n'on pas Ajax...?
Les navigateurs pas compatible...?

--------------------------------
N'empeche que je reste convaincu
qu'on peut faire encore plus de
chose avec la fonction sleep... ^^
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
21 déc. 2006 à 19:57
J'ai une solution pour la boucle infinie...

Pour ne pas consommer tout le CPU, on pourrait faire une requête "HEAD" AJAX en mode synchrone sur un fichier qui n'existe pas, ainsi, le temps de réponse et de transfert est très court ! Malgré que ce temps soit cours, cela suffit pour ne pas user tout le CPU !

Qu'en pensez vous ?

--------------------------------
N'empeche que je reste convaincu qu'on peut faire plein de chose sans fonction sleep...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 déc. 2006 à 13:15
testé et approuvé... résumons, pour toute attente assez courte, on peut utiliser la fonction sleep... (mais uniquement si on ne peut pas facilement faire autrement...)

sleep n'est pas un fantasme, personellement, je ne l'utilise qu'en php pour faire des choses comme attendre un message d'un serveur pour un logiciel comme IRCcgi, ou bien en java pour attendre entre deux ittérations (dans un mini jeu) mais en java, je pourrais faire autrement si j'avais un settimeout...

Bref, souvent, on peut faire sans sleep...
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
18 déc. 2006 à 18:16
Tester et aprouvé ;) lol

Bon donc, résumon, pour toute attente asser courte,
on peux utilisé la fonction sleep( int ) qui elle fait une boucle
a l'infinie
( enfin pas vraiment mé bon ^^" dans la limite du temps quoi )

Mais parcontre pour toute attente moyenne voir longue,
il faut mieux utilisé le setTimeout() qui elle bouffe légèrement,
voir largement moin de CPU,
donc qui est plus agréable et moin dangereux....

La fonction sleep pour toutes attente ne sera donc qu'un fantasme
du programmeur...? :p lol

Cordialement DotWizard512
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
18 déc. 2006 à 01:17
Ben voila c'est malin de poster du code sans même le tester ... tsss bête que je suis :-)

Voici une version testé (j'étais pourtant sur que l'objet Date avait une méthode addMilliseconds) :

Date.prototype.addMilliseconds = function(milliSeconds){
this.setMilliseconds(this.getMilliseconds() + milliSeconds);
}
var sleep = function(timer){
if (typeof(timer) != 'number')
return false;
var d = new Date();
d.addMilliseconds(timer);
while(d > (new Date()));
return true;
}

Ce code est l'équivalent de celui posté par wizard512 il est juste un peu plus propre ;-)

Il ne résoud bien sur pas le problème qui est que pour faire patienter on fait "une boucle infini" mais il n'existe pas d'autres solutions pour faire un sleep simplement en restant dans le context et le "thread" courant. Cela peut être utile dans les cas on l'on veut attendre seulement quelques centaines de ms, dans tous les autres cas il vaut mieux repenser son architecture en utilisant un setTimeout
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
17 déc. 2006 à 23:18
le bout de code ne fonctionne pas,
mais le problème principale est le même, non..?

C'est la boucle While qui bouffe tous le procéssus,
ou me serai-je trompé...?
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 déc. 2006 à 22:46
setTimeout ne suffit pas dans certains cas car il lance un nouveau "thread" on perd le contexte local et cela demande vraiment beaucoup de code pour un simple sleep ...

Bref, la fonction sleep peut être utile et la boucle semi infini est la seule solution. Bien sur ton code peut être simplifié :

var sleep = function(timer){
if (typeof(timer) != 'Number')
return false;
var d = new Date();
d.AddMilliseconds(timer);
while(d > (new Date()));
return true;
}
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
16 déc. 2006 à 13:09
Je suis d'accord mais serait il possible de le formuler sous forme
d'une fonction plus simple, pour une utilisation plus simplifier....

Genre : sleep( 0.5 ); // demi seconde

Meme pour les débutants, pour qu'il soit utilisable par tous les nivo
et type de programmeurs....
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 déc. 2006 à 10:35
à mon avis, setTimeOut suffit largement pour la gestion du temps... Si on découpe correctement son programme, ça suffit, et ça ne mange pas trop de ressources...
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
15 déc. 2006 à 23:09
Ah, ok
La, je suis tous a fait d'accord,
a vrai dire maintenant que j'y suis,
mon script n'est vraiment pas bien adapté a la fonction initial,
donc je te remercie pour tes remarque trés constructives,
et je m'en vais vite trouver une autre solution,


Merci.....
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 déc. 2006 à 20:34
Pas interressant ou une veritable fonction sleep sert a permettre le relachement du CPU pendant un certain temps ( ce dans un language evidemment pas web .. ) mais là elle bloque tout ...
dsl il est vrai du cote austère de mon post.
Ce que je voudrais c'est pas que tu change de code ou dire que ce tu fais est inutile mais que tu nous explique en quoi elle te sert plus qu'un simple setTimeout ..

Louis
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
15 déc. 2006 à 19:02
Merci ARTO_8000 je croyer que isNaN server juste pour vérifier
si la variable n'étais pas "NaN" ^^'
Je ne savais pas quelle avait aussi cette fonction...

RRK275 : Peut etre mais les autres au moin, il avance des arguments, contrairement a toi, donc ton poste ne sert a rien,
sans arguments.....

Merci...
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 déc. 2006 à 17:50
Tout comme d'autre je trouve ce code pas specialement interressant ...
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
15 déc. 2006 à 17:27
Petite remarque, il existe déjà une fonction javascript pour vérifier si une valeur n'est numérique ( isNaN ).
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
15 déc. 2006 à 16:41
Certe c'est pas spécialement évident comme tu la dis,
mais né-enmoin sa peux rendre service et trés bien servire
donc si tu pourais en faire une fonction ou une classe,
et le déposer en tant que nouvelle source
sa aiderai pas mal de gens,
ou alors si tu souhaite, tu peux trés bien m'aider
( si tu as envie bien sur ) a develloper,
ce script, pour obtenir une meilleur fonction sleep( x );
ou alors participer en indiquant les changement éventuel qui
peux etre fait & nous indiquer de nouvelles idées...

Merci....
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
15 déc. 2006 à 16:13
Moi j'utilise setTimeout et un callBack du style :
<<<
function f(callBack) {
var x = 3;
setTimeout(function f2() {
callBack(x);
}, 60000)
}

f(function(x) { alert(x) });
>>>
Mais je reconnais que c'est pas tjrs évident...
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
15 déc. 2006 à 15:52
Effectivement c'est asser lourd,
mais je n'ai pas trouver d'autre solution,
et en plus c'est lourd qu'avec de grosse valeur,
genre : sleep( 60000 ); // 1 minute
La effectivement vous poouvez rencontrer des problemes,
avec les gros valeurs... ^^"

Si quelqu'un a une autre idée afin d'amélioré le script
pas de problème.... ^^

Merci
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
15 déc. 2006 à 15:01
while( Exp > DateInt() )
{
;
}


Tout juste bon pour user tout le CPU...
Bof quoi...
Rejoignez-nous