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

2D Java Discussion :

Ralentir une boucle


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut Ralentir une boucle
    Bonjour,

    Afin d'afficher une annimation de rotation, je doit ralentir une boucle pour ne pas qu'elle s'execute trop vite et que l'annimation s'affiche.

    voicu ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            for(int i=0; i<100; i++){
                phibase+=phi;
                repaint();
            }
    Il faudrait apres le repaint() dans la boucle mettre une "pause" de 1s au moins avant de faire le tour suivant de la boucle.

    Apres quelques recherches j'ai trouvé ces code mais ils ne fonctionnent pas dans mon cas :
    L'image n'est pas reactualisé toutes les seconde mais seulement a la fin de la boucle apres les pauses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	try
    	{
    	    Thread.currentThread().sleep(1000);
    	}
    	catch(InterruptedException ex){}

    Meme chose pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                Object o=new Object();
                try
                {
                    synchronized(o) { o.wait(1); }
                }
                catch(InterruptedException ex) { }

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    SAlut,

    je croyais que la methode sleep etait static et s appelait comme ca :
    Thread.sleep( double );

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Utilise la classe Timer de swing plutôt, c'est fait pour ce genre de choses.

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Seb33300
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	try
    	{
    	    Thread.currentThread().sleep(1000);
    	}
    	catch(InterruptedException ex){}

    Meme chose pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                Object o=new Object();
                try
                {
                    synchronized(o) { o.wait(1); }
                }
                catch(InterruptedException ex) { }
    Oulà, je ne sais pas où tu as trouvé ces codes, mais c'est pas terrible
    Pour le premier, la méthode sleep est static, et donc ne s'appelle pas (de préférence) sur une instance.
    Pour le 2e, ça utilise un méchanisme de synchronisation avec timeout -> c'est pas fait pour ça...

    Donc ça c'était pour ces 2 bouts de code.

    Ensuite, pour faire une pause, certes c'est Thread.sleep(...) qu'il faut utiliser... MAIS...
    D'une part si tu exécutes ceci à partir de l'EDT (ce qui a l'air d'être le cas vu ta phrase "L'image n'est pas reactualisé toutes les seconde mais seulement a la fin de la boucle"), forcément tu bloques le rafraichissement de l'image.
    D'autre part, la vitesse d'évolution d'une animation ne doit pas être influencée par sa vitesse d'affichage.

    Donc, pour résoudre tout ça, au début de ton animation, récupère le temps système par System.currentTimeMillis().
    Ensuite, crée un javax.swing.Timer, dans lequel tu lui demandes de mettre à jour ta variable phibase et de faire ton repaint().
    Ta variable phibase doit être mise à jour en fonction du temps système et non pas au nombre de fois que la méthode à été exécutée, donc tu refais un System.currentTimeMillis() et tu calcules le temps écoulé, ce qui te permet de déterminer la valeur de ton phibase...

    Voilà j'espère que ça t'aura aidé et que ce n'est pas trop confus...

  5. #5
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Merci pour ces messages rapides !

    Par contre je débute en Java et la tu m'as completement largé
    j'ai pas trop compris l'utilisé du timer
    j'ai fait sa mais ça n'a pas trop l'air de fonctionner :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long tps = System.currentTimeMillis();
    		javax.swing.Timer timer = new javax.swing.Timer(1000, events);
     
    		while(i < 150){
    			if(System.currentTimeMillis() > tps+1000){
    				phibase+=phi;
    				repaint();
    			}
    			i++;
    		}
    Ya moyen d'avoir un exemple ?

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Je ne sais pas ce que représente ton phibase, mais je dirais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int écoulé = (int)(System.currentTimeMillis() - tps);
    phibase = écoulé * ...; //phibase a alors une valeur proportionnelle au temps écoulé

  7. #7
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    phibase représente l'angle de rotation

    mais je le place ou ton code ? dans la boucle ?
    et a quoi sert le Timer ?

    et tu parlais aussi de Thread.sleep(...)

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    final int DELAY = 50;
    final long start = System.currentTimeMillis();
    new Timer(DELAY, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int time = (int)(System.currentTimeMillis() - start);
            phibase = time * .05; //1 degré toutes les 50ms
            //...
            repaint();
        }
    }).start();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ralentir une boucle dans NetBeans
    Par fahdmustapha dans le forum NetBeans
    Réponses: 1
    Dernier message: 25/12/2011, 18h56
  2. ralentir une boucle for
    Par oliv27400 dans le forum MATLAB
    Réponses: 9
    Dernier message: 30/07/2010, 09h35
  3. ralentir l'exécution d'une boucle
    Par al9000 dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2010, 12h21
  4. Ralentir une boucle
    Par Jidewe dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/07/2009, 18h18
  5. [loop] ralentir le traitement d'une boucle
    Par jontleman dans le forum Windows Forms
    Réponses: 7
    Dernier message: 30/11/2007, 14h34

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