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

  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 : 40
    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 : 40
    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 : 40
    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();

  9. #9
    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 : 40
    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 je teste sa demain

    et une question
    c'est quoi "final" ?

  10. #10
    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
    et une question
    c'est quoi "final" ?
    http://java.developpez.com/faq/java/..._KEYWORD_final

  11. #11
    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 : 40
    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
    Citation Envoyé par ®om
    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();
    Merci l'annimation fonctionne !
    mais pas comme je le souhaite.

    Premierement comment l'arreter ?

    Ensuite mon code se présente de cette forme :

    // code avant l'annim

    // Déclenchement de l'annimation

    // code avant l'annim

    Le probleme c'est que lorsque l'annimtion est déclenché il continu a executer le code qui est derriere, alors qu'il faudrais qu'il attende qu'elle s'arete pour executer le code apres l'annimation

    Et aussi j'ai une classe a part qui me gere les evenement, et j'aimerai m'en servir plutot que de recreer un "ActionListener"
    Donc comment savoir que l'evenement est celui du Timer ?

  12. #12
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Le probleme c'est que lorsque l'annimtion est déclenché il continu a executer le code qui est derriere, alors qu'il faudrais qu'il attende qu'elle s'arete pour executer le code apres l'annimation

    Si je ne m'abuse tu a fais un Thread?
    Donc c'est le but d'un Thread. Sinon il te faudrait faire un bout de code qui regarde si ton thread est en cours, si c'est le cas tu ne fais rien d'autre

  13. #13
    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 : 40
    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
    Citation Envoyé par ®om
    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();
    Il y a un moyen d'arreter le timer ?

  14. #14
    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
    Il y a un moyen d'arreter le timer ?
    Oui, tu affectes ton timer à une variable, et tu fais timer.stop().

  15. #15
    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 : 40
    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
    oui mais avec la facon dont tu me l'as mis ça ne passe pas :

    Non concordance de types : impossible de convertir de void en Timer

  16. #16
    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
    oui mais avec la facon dont tu me l'as mis ça ne passe pas :
    Timer timer = ... (sans le .start())
    timer.start();
    timer.stop();

  17. #17
    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 : 40
    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
    Dernier petit probleme avec ce timer :

    J'aimerai arreter le timer suivant une condition à l'interieur de celui ci (si j'utilise this.stop() cela n'a pas l'air de fonctionner) et ci je place le timer.stop() à l'interieur non plus :

    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
    final int DELAY = 50;
    final long start = System.currentTimeMillis();
    final Timer timer = new Timer(DELAY, new ActionListener() {
        int i = 0;
        public void actionPerformed(ActionEvent e) {
        	if(i<30){
    	        // Code
    	        repaint();
    	        i++;
        	}else{
        		// stop l'annimation
        		// Code
    		timer.stop(); // La variable locale timer n'a peut-être pas été initialisée
    		repaint();
        	}
        }
    });
     
    timer.start();

  18. #18
    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 : 40
    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
    Je viens de trouver un méthode qui fonctionne, par contre je sais pas si elle est bonne :

    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
    final int DELAY = 10;
    new Timer(DELAY, new ActionListener() {
        int i = 0;
        public void actionPerformed(ActionEvent e) {
        	if(i<30){
    	        phibase += phi; //time * .05; //1 degré toutes les 50ms
    	        repaint();
    	        i++;
        	}else{
    	        // Code
    	        repaint();
    	        Thread.currentThread().destroy();
        	}
        }
    }).start();

  19. #19
    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
    je sais pas si elle est bonne
    non

    Thread.destroy() est dépréciée...

  20. #20
    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 : 40
    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
    J'ai vu ça mais en fait je ne sais pas vraiment ce que cela veut dire...

    Et je peux utiliser quoi à la place ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

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

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