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

Java Discussion :

Thread sleep dans une boucle


Sujet :

Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut Thread sleep dans une boucle
    Bonjour,

    J'ai juste une petite question d'esthétisme :

    Je voulais faire un cadre clignotant autour d'un bouton. N'étant pas trop habitué à faire des animations, j'ai bricolé un truc :
    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
        private class Blinking extends Thread {
            private boolean continuer=true;
            @Override
            public void run() {
                while(continuer) {
                    monBouton.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.red, Color.red.brighter()));
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Loading.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    monBouton.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED, ColorManager.transparent(), ColorManager.transparent()));
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Loading.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
            public void arreter() {continuer=false;}
    }
    Je n'utilise pas stop() d'une part parce que l'instruction est dépréciée et d'autre part afin de m'assurer de l'état final de la bordure.

    Questions :
    - Est-ce que vous pensez que c'est un bonne façon de procéder ? Y a-t-il une façon plus conventionnelle ou plus propre ?
    - NetBeans me met un Hint sur le "Thread.sleep(..);". Il y a une meilleure façon de faire ?

    Merci

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    je ne réponds pas à la question posée ....
    mais juste quelques détails qui sautent aux yeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //nécessaire
    private volatile boolean continuer = true ;
    ...
    //facultatif
    catch(InterruptedException e) {
      break ;
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch(InterruptedException e) {
      break ;
    }
    Oui, c'est mieux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //nécessaire
    private volatile boolean continuer = true ;
    Bien vu.

    Par contre, toujours aucun avis sur la forme ? Je dois comprendre que vous auriez procédé de cette façon ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    moi j'aurais utilisé un javax.swing.Timer. Ça fait la même chose mais ça évite de programmer soi-même Threads et sleep()s.

    Mais bon, c'est des question de UI Java, ça, le forum dédié pourrait proposer des retours plus intéressants.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    moi j'aurais utilisé un javax.swing.Timer. Ça fait la même chose mais ça évite de programmer soi-même Threads et sleep()s.
    Bon, je considère donc que je suis pas complètement à côté de la plaque.

    Merci pour votre aide.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur logiciel embarqué
    Inscrit en
    Juillet 2002
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2002
    Messages : 404
    Par défaut
    pour éviter d'attendre l'arrêt j'ajouterai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void arreter() {continuer=false; this.interrupt();}
    et je préfère la mémorisation des bords pour ménager le GC aussi, mais c'est très personnel comme approche, globalement c'est du détail.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
    Border b[] = new Border[2];
    b[0]=BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.red, Color.red.brighter());
    b[1]=BorderFactory.createEtchedBorder(EtchedBorder.RAISED, ColorManager.transparent(), ColorManager.transparent());
     
    while(continuer) {
    ...
     
    monBouton.setBorder(b[x]);

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    J'aime bien. Je prends.

    Merci

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu ne devrais pas modifier, surtout pas, ton Border dans ton Thread. Les composants swing ne sont pas Thread Safe. Soit tu utilise un timer, comme suggéré (du coup t'es dans le thread graphique de l'EDT), soit tu doit invoquer l'EDT pour tes modifications:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     while(continuer) {
                    SwingUtilities.invokeAndWait(new Runnable(){ public void run() {
                        monBouton.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED, Color.red, Color.red.brighter()));
                        }});

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

Discussions similaires

  1. 3 Thread dans une boucle for
    Par Etudiante_Ines dans le forum Général Java
    Réponses: 27
    Dernier message: 16/03/2012, 21h57
  2. Méthode Wait,Sleep dans une boucle
    Par kilian68 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 17/12/2009, 11h50
  3. sleep dans une boucle de daemon
    Par TheDrev dans le forum Linux
    Réponses: 6
    Dernier message: 05/08/2009, 16h33
  4. thread avec return dans une boucle
    Par Tanebisse dans le forum Général Java
    Réponses: 19
    Dernier message: 19/05/2008, 17h42
  5. Comment faire un Sleep dans une boucle PL/SQL
    Par foster06 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 01/02/2008, 18h59

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