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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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) { }
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

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

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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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 ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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(...)
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Merci je teste sa demain

    et une question
    c'est quoi "final" ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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 ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    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
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  13. #13
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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 ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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();
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  18. #18
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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();
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  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
    Points : 3 080
    Points
    3 080
    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 émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    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 ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

+ 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, 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