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

EDT/SwingWorker Java Discussion :

Threads - EDT


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut Threads - EDT
    Bonjour,

    dans mon code j'effectue des opérations qui peuvent durer très longtemps. J'aimerais que l'utilisateur soit informé de l'avancée des opérations grâce a une JProgressBar.

    Je me suis documenté sur le sujet, mais j'ai de la peine a comprendre la direction que je dois prendre.

    Dois-je mettre mes opérations de longue durée dans un thread et ma JProgressBar dans un autre pour que les opération s'effectuent en parallèle ?

    Les thread s'exécutent-ils dans l'EDT ? A quoi dois-je faire attention pour que mon affichage ne se bloque pas ?

    Et finalement, comment puis-je faire en sorte que la JProgressBar se remplisse en fonction de l'état d'avancement des opération ? Avec une variable volatile ?

    Dans l'idéal, j'aimerais également mettre un texte qui décris l'opération en cours, dois-je le mettre dans un nouveau thread ?

    J'aimerais bien que vous me mettiez sur la voie, car il y a tellement de trucs que je n'y arriverais jamais en me lançant au pif. Une vision globale des choses m'aiderait beaucoup.

    J'ai vu que cette question a déjà été posée plusieurs fois, mais je n'ai jamais trouvé de réponse complète.

    Merci d'avance

  2. #2
    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
    En gros, tu fais un nouveau Thread pour ton traitement long:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Thread t = new Thread() {
        @Override public void run() {
            //traitement long partie 1
            //traitement long partie 2
            //traitement long partie 3
            //traitement long partie 4
        }
    };
    Et tu ajoutes dans ce Thread le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            maProgressBar.set...(...);
        }
    });
    Ce qui donne:
    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
    22
    23
    24
    25
    26
    27
    28
    Thread t = new Thread() {
        @Override public void run() {
            //traitement long partie 1
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    maProgressBar.set...(...);
                }
            });
            //traitement long partie 2
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    maProgressBar.set...(...);
                }
            });
            //traitement long partie 3
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    maProgressBar.set...(...);
                }
            });
            //traitement long partie 4
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    maProgressBar.set...(...);
                }
            });
        }
    };
    Tu peux aussi utiliser SwingWorker à partir de Java 1.6...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Merci pour ta réponse.

    Le traitement long doit donc obligatoirement être séparé en plusieurs parties si je comprend bien.

    J'essaierai tout ça demain

  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 Bloodscalp
    Merci pour ta réponse.

    Le traitement long doit donc obligatoirement être séparé en plusieurs parties si je comprend bien.

    J'essaierai tout ça demain
    En fait, il est "séparé" en quelque sorte, mais c'est juste que tu "injectes" la mise à jour graphique de temps en temps dans ton traitement...

    La classe SwingWorker permet d'avoir une meilleure abstraction...

  5. #5
    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,

    Citation Envoyé par ®om
    Tu peux aussi utiliser SwingWorker à partir de Java 1.6...
    Pas besoin de Java 6 ! Tu peux l'utiliser dans Java 5.0 via un backport : https://swingworker.dev.java.net/

    Mais il faut également savoir que cette classe existe quasiment depuis Swing, car elle faisait partie des premiers tutoriaux de Sun concenant Swing : http://java.sun.com/docs/books/tutor...ml#SwingWorker
    (toutefois son API est très différente de la version 5.0/6).


    Citation Envoyé par Bloodscalp
    Le traitement long doit donc obligatoirement être séparé en plusieurs parties si je comprend bien.
    Le traitement long doit être exécuté dans un thread à part, alors que tout ce qui touche à l'affichage (et donc la mise à jour du progress) doit être fait dans le thread de l'EDT...

    a++


    a++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Si on appelle une méthode depuis un thread, cette méthode sera-t-elle aussi exécutés dans le thread ? ou alors dans l'EDT ?

    Et y'a-t-il un risque/inconvénient à créer une grande quantité de thread ? Faut-il essayer d'en créer le moins possible ?

  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
    Citation Envoyé par Bloodscalp
    Si on appelle une méthode depuis un thread, cette méthode sera-t-elle aussi exécutés dans le thread ? ou alors dans l'EDT ?
    Les méthodes sont toujours exécutés dans le thread où elles sont appelées, mais elles peuvent bien entendu créer d'autre thread ou utiliser l'EDT avec SwingUtilities.invokeLater() et SwingUtilities.invokeAndWait()...


    Enfin, toutes les méthodes relatives aux évènements de l'interface graphique sont appelé par l'EDT (actionPerformed(), mouseClicjked(), etc.)


    Citation Envoyé par Bloodscalp
    Et y'a-t-il un risque/inconvénient à créer une grande quantité de thread ? Faut-il essayer d'en créer le moins possible ?
    Créer un thread a un coût... mais il est surement moins problématique que de bloquer l'EDT...

    Et puis généralement on ne crée pas de très grand nombre de thread à la fois (à moins que l'utilisateur s'acharne à cliquer sur un bouton).

    A noter que l'implémentation de SwingWorker pour Java 5.0/6 utilise un Executor et un pool de thread (10 à la fois il me semble).

    a++

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Ça fonctionne parfaitement

    Merci beaucoup pour votre aide.

    (Rom ton code est bien mais il y a pas mal d'erreurs )

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

Discussions similaires

  1. Swing thread EDT et JFrame
    Par aspire dans le forum Agents de placement/Fenêtres
    Réponses: 13
    Dernier message: 08/08/2013, 17h41
  2. EDT Thread et JTreeTable
    Par LaChocolaterie dans le forum EDT/SwingWorker
    Réponses: 0
    Dernier message: 12/03/2010, 23h09
  3. JFrame vide EDT et Thread
    Par genamiga dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 17/07/2009, 10h11
  4. Threads et EDT
    Par apqmwnqmap dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/10/2008, 14h53
  5. Multiple thread peuvent ils bloquer (EDT) malgre invokeLater
    Par murgen23 dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 12/09/2008, 07h56

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