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 :

[POO] Souci avec la fonction SetTimeOut


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut [POO] Souci avec la fonction SetTimeOut
    Bonjour,

    J'ai un problème auquel je ne comprend rien du tout.
    Je suis en train de développer un site, où tout le contenu se trouve dans 4 objets, et ces objets sont susceptible de se déplacer à travers l'écran. Cet effet de déplacement est créer par des appels successif de la fonction SetTimeOut() séparé d'1ms. A chaque appel, l'objet est déplacer de "x" pixel, x variant à chaque itération (pour donner un effet d'accéleration ou de ralentissement).

    Maintenant, le problème, c'est que mon code à l'air de fonctionner mais me pose quelque souci plutôt aléatoire :
    - Sur IE et sur Safari, tout fonctionne très bien.
    - Sur FireFox (version 3 ou 2), il y a des ralentissement, le déplacement n'est pas toujours fluide, et le temps de déplacement est beaucoup plus long et assez aléatoire, par rapport aux autres navigateurs.
    Ce qui est terrible, c'est que la vitesse varie selon les PC, et par exemple, sous MacOs, le déplacement fonctionne parfaitement.

    De plus, ces ralentissements se produisent uniquement lorsque je déplace plusieurs objets en même temps, c'est à dire qu'il y a jusqu'à 4 SetTimeOut indépendant qui fonctionnent en même temps.

    Enfin, ces tests ont été fait directement sur mon serveur Apache, et lorsque je prend le code et que je le fais tourner sur EasyPHP, tout fonctionne.

    Je ne comprend plus rien
    Une idée?

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    bonjour,

    Par hasard, tu n'observes pas de ralentissement ou d'accélération lors des déplacements lorsque tu déplaces ta souris dans le document ?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    Bonsoir,

    Euh, je ne sais pas exactement de quoi tu parle. J'ai donc essayé. Lors du chargement, si je déplace ma souris comme un fou, ça ne change rien.
    Par contre, si j'essaye de sélectionner un élément (en le noircissant) et en continuant de déplacer ma souris, ca ralentis encore plus sous Firefox, uniquement.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    faudrait voir comment le code est fait.. et surtout ce que lance le setTimout, a mon avis si il lançait une nouvelle instance de fonction tu n'aurais plus ce souci
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Citation Envoyé par talrashha Voir le message
    Bonsoir,

    Euh, je ne sais pas exactement de quoi tu parle. J'ai donc essayé. Lors du chargement, si je déplace ma souris comme un fou, ça ne change rien.
    Par contre, si j'essaye de sélectionner un élément (en le noircissant) et en continuant de déplacer ma souris, ca ralentis encore plus sous Firefox, uniquement.
    Disons que j'ai réalisé quelques scripts qui réalisent des défilements d'images ou de textes (des scripts équivalents à ce que fait une balise marquee). Le défilement était parfois saccadé ou ralenti. Il suffisait que je déplace la souris dans le document pour le défilement soit plus fluide. C'était très visible sous la version 2 de Firefox.

    De plus, ces ralentissements se produisent uniquement lorsque je déplace plusieurs objets en même temps, c'est à dire qu'il y a jusqu'à 4 SetTimeOut indépendant qui fonctionnent en même temps.
    et chaque setTimeout déclenche une fonction dans un délai de 1ms ?
    Il faudrait voir comment sont gérés tes setTimeout. Un bout de code ?

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    Bonjour,

    D'accord, voilà comment fonctionne le truc :
    J'ai une fonction "Create_Object()" qui créer un objet avec tout un tas d'attribut calculé dont je me sert pour trouver la distance à déplacer à chaque itération (elle est longue, je vous la fournirait en partie si nécessaire).

    La fonction déplace est appelé sur de ces objets. A chaque itération, elle déplace l'objet sur l'axe X puis sur l'axe Y, puis se rappelle jusqu'à une condition "evalue".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    function deplace(objet, pas_X, pas_fin_X, nb_change_X, pas_Y, pas_fin_Y, nb_change_Y) {
    	//deplacement de l'objet	
    	var tmpX=pas_X-objet.act*nb_change_X;
    	var tmpY=pas_Y-objet.act*nb_change_Y;
    	var evalue;
    	if(objet.act==1) {
    		evalue=(pas_X > pas_fin_X)||(pas_Y > pas_fin_Y);
    	}
    	else {
    		evalue=(pas_X < pas_fin_X)||(pas_Y < pas_fin_Y);
    	}
    	document.getElementById(objet.name).style.left=document.getElementById(objet.name).offsetLeft+objet.act*objet.sensX*pas_X+"px";
    	document.getElementById(objet.name).style.top=document.getElementById(objet.name).offsetTop+objet.act*objet.sensY*pas_Y+"px";
     
    	//test de fin
    	if(evalue) {	
    		objet.process=setTimeout( function() { deplace(objet, tmpX, pas_fin_X, nb_change_X, tmpY, pas_fin_Y, nb_change_Y); }, objet.interv);
    	}
    	else {
    		clearTimeout(objet.process);
    		if(objet.act==1) {
    			objet.set_show();
    		}
    		else {
    			objet.set_hide();
    		}
    		this.act=0;
    	}
    }
    Quelques remarques :
    - this.interv est initialisé à la création des objets, et vaut 1.
    - lorsque les objets se déplacent, les calculs sont fait pour qu'il se déplacent tous durant le même temps. Lorsqu'un objet arrive en bout de course, tous les autres y arrivent aussi.

    Voila, éclairez moi

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet.process=setTimeout( function() {new  deplace(objet, tmpX, pas_fin_X, nb_change_X, tmpY, pas_fin_Y, nb_change_Y); }, objet.interv);
    ??
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    1 ms, ça fait court! Selon moi, la page n'a même pas le temps d'effectuer l'opération de déplacement qu'il faudrait déjà la refaire (d'où la saturation)...

    Peut-être devrais-tu augmenter le nombre de pixel pour chaque itération et augmenter aussi le délai de setTimeout.
    Je pense que si tu doses bien ces 2 paramètres, l'effet de déplacement devrait rester le même, mais cela consomerait moins de ressource.
    De retour parmis vous après 10 ans!!

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    Salut,

    Je viens de tester ce que tu as mis... mais je ne constate aucun changement. Vous pouvez jeter un coup d'œil sur le site pour y voir le résultat à l'adresse http://talrashha.no-ip.org. Vous pourrez constater par vous même que le changement est flagrant sous IE ou sur FF.

    Par contre, par curiosité : je n'ai pas compris pourquoi il faudrait rajouter un "new" ici... pour moi, "deplace" n'est qu'une fonction, il ne devrait donc pas être nécessaire de mettre un "new" qui est pour moi une façon d'instancier un objet...

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Sub0 Voir le message
    1 ms, ça fait court! Selon moi, la page n'a même pas le temps d'effectuer l'opération de déplacement qu'il faudrait déjà la refaire (d'où la saturation)...

    Peut-être devrais-tu augmenter le nombre de pixel pour chaque itération et augmenter aussi le délai de setTimeout.
    J'ai songé à cela, j'ai pas encore vraiment trouvé de réglages optimaux, mais dans le principe, plus j'augmente l'intervalle, moins c'est fluide...
    L'autre truc bizzard, c'est que mon système fonctionne sur les autres navigateurs, donc soit il y a effectivement une gestion du settimeOut qui limite son utilisation pour réduire la puissance nécessaire, et dans ce cas, il n'existe pas d'autre solution que celle que tu m'as cité, doit le problème viens d'ailleurs...
    Je vais quand même faire le calcul pour faire quelques tests en tablant sur 25 images par seconde, mais cela me parait tout de même étrange...

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 153
    Points : 161
    Points
    161
    Par défaut
    Re bonsoir,

    Je viens de faire un test en changeant l'intervalle en 40ms au lieu de 1... et rien ne change comme je le pensais...
    Le résultat reste totalement fluide sur IE, mais saccadé sur FF

Discussions similaires

  1. [POO] Passet un objet avec la fonction setTimeout()
    Par Death83 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 27/08/2007, 22h36
  2. Souci avec la fonction SetFocus
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/04/2007, 12h53
  3. Boucle avec la fonction setTimeout
    Par mathilda dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2006, 10h08
  4. [Système] P'tit soucis avec la fonction EXEC
    Par nais_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/08/2006, 11h36
  5. [POO] Pb avec les fonctions xml et la POO
    Par QuantuX dans le forum Langage
    Réponses: 1
    Dernier message: 17/06/2006, 14h54

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