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

Interfaces Graphiques en Java Discussion :

JAVA - Pb de thread


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut JAVA - Pb de thread
    Bonjour à tous,
    Je débarque sur les threads, et j'essaye d'en utiliser un pour afficher une barre de progression.
    Je souhaite lancer le thread au début du chargement, et l'arrêter à la fin.

    Voici donc ma classe :
    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
     
    public class MyThread extends Thread {
      private JFrame jf = null;
     
      public MyThread (JFrame jf) {
        this.jf = jf; // interface principale
      }
     
      public void run() {
        while (true) {
          ((MonInterface)jf).mpb.maBarre.setValue (((MonInterface)jf).chargement); // où chargement est le pourcentage courant
          ((MonInterface)jf).mpb.maBarre.updateUI();
        }
      }
    }
    Dans mon interface principale, je met à jour ma variable qui représente le pourcentage, et mon thread est sensé le surveiller, et mettre à jour la barre en fonction :

    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
     
        myThread = new MyThread(this);
        myThread.start();
        chargement = 10;
    ... traitement...
        chargement = 20;
    ... traitement...
        chargement = 40;
    ... traitement...
        chargement = 60;
    ... traitement...
        chargement = 80;
    ... traitement...
        chargement = 100;
        myThread.interrupt();

    Mon pb est que le thread semble ne jamais s'arrêter, l'appli rame, la barre de progression scintille et reste à 100, et j'ai des Exceptions de ce type :

    Exception in thread "Thread-3" java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicProgressBarUI.uninstallListeners(Unknown Source)
    at javax.swing.plaf.basic.BasicProgressBarUI.uninstallUI(Unknown Source)
    at javax.swing.JComponent.setUI(Unknown Source)
    at javax.swing.JProgressBar.setUI(Unknown Source)
    at javax.swing.JProgressBar.updateUI(Unknown Source)
    at dvdorganizer.MyThread.run(MyThread.java:15)

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicProgressBarUI.paintDeterminate(Unknown Source)
    at javax.swing.plaf.metal.MetalProgressBarUI.paintDeterminate(Unknown Source)
    at javax.swing.plaf.basic.BasicProgressBarUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
    at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

    Pourriez-vous me dépanner svp ?

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    il faudrait voir ce qui se passe dans UpdateUI()...

    mais un appel à Thread.sleep() dans la boucle while de ta methode run() ne serait pas de trop. Il n'est pas utile que ton thread tourne constamment.

    et tu pourrais remplacer while (true) par while (chargement < 100)

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Citation Envoyé par dude
    il faudrait voir ce qui se passe dans UpdateUI()...

    mais un appel à Thread.sleep() dans la boucle while de ta methode run() ne serait pas de trop. Il n'est pas utile que ton thread tourne constamment.

    et tu pourrais remplacer while (true) par while (chargement < 100)
    Merci Dude, ça marche déjà mieux, plus de plantage avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'while (chargement <100)'
    Mais à la fin du chargement ma barre de progression n'est pas "à jour" : elle peut rester à 50 ou 70 ou 90%... c'est aléatoire...
    Je précise que pour l'instant vu mon volume de données il faut moins d'1 seconde pour que le chargement se fasse, je n'ai donc pas mis de sleep dans ma boucle...

  4. #4
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    while (chargement <= 100)

  5. #5
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    et meme pour un petit volume de données, un Thread.sleep(100) n'est pas inutile

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 282
    Par défaut
    Merci à tous, ça marche comme je le souhaitais.
    @ + !

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    1. La mise à jours de l'interface graphique ne doit pas être effectué dans n'importe quel Thread mais seulement dans l'EDT (plus d'info : Threads et performance avec Swing par Gfx)
    2. Tu accèdes à l'attribut chargement depuis deux threads différents sans synchronization : cela peut te poser des erreurs indéterminé...
    3. Appeller updateUI() c'est un peu lourd comme traitement pour mettre à jours un composant...
    Il serait peut-être plus simple de passer par la classe SwingWorker...
    Quel version de Java tu utilises ???

    a++

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

Discussions similaires

  1. Java Heap space - threads
    Par nabich dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 06/11/2011, 08h58
  2. java et les thread
    Par gentelmand dans le forum Général Java
    Réponses: 13
    Dernier message: 23/09/2009, 09h49
  3. Java Heap Space - Threads non libérés ?
    Par valerie.taesch dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 20/04/2009, 20h23
  4. [PROFILER][THREAD][java.prof] outil gratuit/complet?
    Par narmataru dans le forum Général Java
    Réponses: 11
    Dernier message: 16/11/2005, 12h28

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