IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Temps d'execution d'un script et rafraichissement ecran


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut Temps d'execution d'un script et rafraichissement ecran
    Bonjour,

    Je travaille actuellement sur du path finding vie javascript et jquery.

    Selon la taille de la carte le script peux prendre un petit moment et provoquer la demande d’arrêt du script de la part de Firefox.
    existe t'il un moyen d’empêcher cela ?
    En me renseignant il semblerais que cela ne soit pas possible.
    Cependant existe t'il un moyen que ma boucle puisse "dialoguer" avec le navigateur afin que celui ci ne considère pas le script comme planté ?

    Un autre probleme dans mon script, j'utilise une boucle while.
    Dans cette boucle j'utilise le .css de Jquery afin de changer la couleur des div de ma page.
    Seulement, les modifications n'apparaissent qu'une fois que le script est terminé.
    Comment faire pour que mes div se colorent a chaque passage de ma boucle while ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Salut,

    la solution à tes deux problèmes repose essentiellement sur des timeouts. Il faut que tu sépares des « blocs » de code dans ton script, que tu les transformes en fonctions callback, et ainsi chaque bloc pourra appeler le bloc suivant au moyen d'un setTimeout. Comme tu utilises jQuery, jette un œil du côté de la fonction queue. En ajoutant des timeouts dans ton script, même avec une durée de 0, tu crées des pauses et tu permets au navigateur de « respirer ». C'est durant ces phases de respiration que, notamment, le navigateur va faire un reflow graphique, en prenant en compte toutes les modifications de style apportées par ton script.

    Pour ta boucle while, il faut que tu transformes le bloc de la boucle en fonction récursive. À la fin du bloc, place dans un if le test de la boucle ; ta fonction devra se rappeler elle-même (ou se mettre en queue) seulement si le test if est positif.

    Par exemple, la boucle :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (i < 10) {
       // ... le code de la boucle
    }
    devient :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function chose() {
       // ... le code de la boucle
       if (i < 10) {
          setTimeout(chose, 0);
       }
    }
    chose();

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut
    Merci pour cette solution explicite.

    j'était sur la piste des timeOut mais je n'aurais pas trouvé le coup du while tout seul.

    Je teste ça et je reviens fermer le sujet

    Encore Merci.

  4. #4
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par Watilin Voir le message
    devient :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function chose() {
       // ... le code de la boucle
       if (i < 10) {
          setTimeout(chose, 0);
       }
    }
    chose();
    On n'a JAMAIS besoin de raffraichir une page toutes les 0 millisecondes, sachant que ni l'oeil humain ni le navigateur ne pourra suivre, je mettrai un délai d'au moins 50 millisecondes..

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    En fait on s'en fout du délai. Le but est juste de permettre un reflow, et je pense que les navigateurs limitent la fréquence des reflows. En gros c'est le navigateur qui choisit le délai. Du coup je ne vois pas bien l'intérêt de ralentir davantage le script, en rajoutant des délais qui ne servent en fait à rien...

  6. #6
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 130
    Points
    9 130
    Par défaut
    une bonne vieille méthode qui date de l'époque des OS multitâches collaboratifs (non-préemptif)

    supposons que le job à exécuter soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (i > 0) {
      foo(A[i--]);
    }
    pour lequel i est treks grands. L’idée consiste à ne traiter qu'un petit paquet et à rendre la main. Il faut faire une fonction qui traite un paquet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function traite(A, i) {...}
    cette fonction fait la boucle sur x éléments. Si on a atteint la fin du traitement, on s'arrête sinon on remet dans la pile des événements un appel à la fonction pour le paquet suivant avec un timer.

    Ainsi le système récupère la main à la fin de chaque paquet et peut traiter les événements qui se sont accumulés pendant le temps du traitement. On aura alors un fonctionnement qui simule le comportement d'un thread.

    Il existe une théorie informatique sur le sujet.
    voici deux liens sur le sujet (un en java l'autre en C)
    http://www-sop.inria.fr/meije/rp/Fai...irThreads.html
    http://stephanekouadio.blogspot.fr/2...airthread.html
    l'INRIA a travaillé sur le sujet et on trouve la chose sous l'intitulé Reactive Programing http://www-sop.inria.fr/meije/rp/

    Si vous vous demandez pourquoi on fait toujours de la recherche sur ce genre de chose alors que les OS sont multitâches préemptif et que les langages embarquent pour la plupart la notion de Thread. La réponse est que le multitâche coopératif résous naturellement des problèmes complexes de communication entre thread.
    A+JYT

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 98
    Points : 35
    Points
    35
    Par défaut
    Merci pour vos réponses.

    Les articles sur les threads sont très intéressant.
    Cependant, il s'agit d'un projet pédagogique pour moi.
    Du coup je vais utiliser setTimeout puis voir la queue de JQuery et après les Threads. Histoire de bien comprendre ce que je met en place.

    Je me demandais si l'utilisation de setTimeout ne serait pas une question intéressante pour la FAQ.
    Ça dois arriver souvent ce genre de problèmes...

Discussions similaires

  1. Diminuer le temps d'execution d'un script perl
    Par Isabella83 dans le forum Langage
    Réponses: 16
    Dernier message: 24/02/2012, 12h46
  2. [MySQL] temps d'execution d'un script sur un serveur web
    Par cerco1 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/10/2011, 19h30
  3. temps d'execution d'un script
    Par kevin07 dans le forum Linux
    Réponses: 6
    Dernier message: 29/07/2009, 16h38
  4. Réponses: 4
    Dernier message: 21/08/2006, 04h54
  5. Temps d'execution d'un script c++ sous linux
    Par sharantyr dans le forum Linux
    Réponses: 10
    Dernier message: 04/06/2006, 19h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo