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 :

Swing et les thread, pour changer..


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut Swing et les thread, pour changer..
    Bon, je viens de lire tout les tuto, forum possibles et imaginable sur le net et sur ce site.. je bloque et je deviens fou avec l'utilisation de swing.

    je vous expose le problème (à peut près similaire a tous les post de cette section semble t'il)

    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
    29
    30
    31
    32
    class gui(){
    // construction de l'interface graphique
    }
     
    Void main (...){
    invokeandWait(gui);
    }
     
    class GestionAction implements ActionListener {
    actionPerformed(e){
     
    // ouvre une boite de dial pour choisir un fichier
    if (status = approve_option) {
     
    // nouveau thread
    travail_long(progress_bar)
    travail_long.start();
     
    }
     
     
    travail_long(){
     
    boucle(
    // fait beaucoup de chose qui prenne du temps
     
    SwingUtilities.invokeLater{
    progress_bar.setvalue(incremente);}
     
    )
     
    }

    Voila, je fait une interface graphique, que je lance.. jusque la pas de problème, ensuite un nouveau thread est démaré lors d'un cklick sur un bouton, le thread fait un gros traitement et dans une boucle devrait incrémenter un progress bar... mais rien de marche, le progress bar se met à jour qu'a la fin du gros traitement.. je désespère.

    j'ai bien compris le fait qu'on ne doit pas fair de traitement dans l'EDT car ça bloque tout, mais la je lance un thread à part, alors pourquoi blocs il toujours mon IHM ??
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

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


    Le traitement lourd doit être fait dans un thread à part, mais la mise à jour du JProgressBar doit se faire dans l'EDT...

    Le plus simple serait de passer par SwingWorker et d'utiliser un PropertyListener pour mettre à jour la barre de progression : http://www.developpez.net/forums/d62...r/#post3669919

    a++

  3. #3
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut
    Juste pour clarifier, parceque la j'ai des mots de tête..

    voila une figure très simple :



    Le model 1, c'est ce que je veux faire, et qui pour moi devrait être faisable.

    l'EDT s'occupe d'afficher les composants, avec ça pile, déja ça me gonfle mais bon c'est comme ça,
    ensuite un autre thread éxecute des actions, impactant la vue, normale, et donc je le fait via
    la méthode statique invokelater qui est sensé mettre ça dans ça pile, et donc théoriquement les afficher
    dès qu'il le peut, mais bon ce model ne marche pas à priori, le thread demmare, mais tout ce passe comme
    si ce n'était pas un thread puisque l'affichage reste figé, et la je comprend pas pourquoi.


    Le model 2, que j'ai vu plusieurs fois sur le net doit marcher mais me parrait completement pourri au
    point de vue programmation.

    Comme le model 1, l'edt et un thread sont lancés, mais pour intéragire entre les deux
    nous somme obligé de fair un timer, qui écoute ou en est le thread, récuperer les valeurs puis enfin
    les mettre l'affichage dans la pile de l'edt..

    Comment voyer vous la chose ?
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  4. #4
    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
    Le modèle 1 correspond exactement à l'utilisation de SwingWorker...


    Maintenant si cela ne marche pas c'est qu'il y a un problème avec le code de ton thread, et il faudrait donc le voir...

    a++

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    J'ai l'impression que tu as bien compris le fonctionnement (abstraction faite des humeurs :-), il doit y avoir autre chose, ou alors tu appliques mal ce que tu as compris.

    Pourrais-tu nous faire un mini-programme complet en 1 seule classe qui compile montrant ce que tu veux qu'on puisse t'aider ?

    Quelques fois aussi quand tu lances un thread depuis le EDT, il faut lui donner un priorité plus basse que l'EDT ; c'est ce que je vois de temps en temps dans la doc, mais je le fais jamais.

    Ou bien, suit les conseils d'adiGuba.

  6. #6
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut
    Bon.. j'ai finalement mis en place le model 2, et ça marche, donc je vais réster comme ça vu que mon programme n'a pas vocation à évoluer beaucoup.

    Pour info, le model 2 signifie que j'ai mon thread mes à jour des attribus dans ça boucle principale, que je récupère à l'aide d'un timer. Chaque tick du Timer rafraichi le progressBar en fonction des attribus du Thread.

    Je pense qu'après tout ça je vais faire un programme concret avec les deux modèle et les poster sur le site pour que les autres en profites, parceque mon code actuèle n'est pas libre
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

Discussions similaires

  1. Utiliser les threads pour créer une fenêtre de LOG ?
    Par davidmarli dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2011, 16h01
  2. Obligé d'utiliser les threads pour faire un timer ?
    Par theclem35 dans le forum Débuter
    Réponses: 5
    Dernier message: 31/03/2011, 21h25
  3. Swing et les threads
    Par mhamedbj dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 30/01/2008, 13h11
  4. Problème avec les Jlist pour changer :)
    Par catwomanette dans le forum NetBeans
    Réponses: 4
    Dernier message: 04/01/2007, 10h44
  5. Utiliser les threads pour les traitements long
    Par rach375 dans le forum Websphere
    Réponses: 3
    Dernier message: 14/11/2006, 13h08

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