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

Langage Java Discussion :

comprendre une partie de code


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut comprendre une partie de code
    Salut à tous,

    J'ai rucupéré une partie de code et je ne comprends pas l'interet du Runnable runner. Je ne vois pas à quoi il sert...

    Si quelqu'un comprends:

    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
        public class BuildThread extends Thread {
             public BuildThread() {
            }
     
            public void run() {
                Runnable runner= new Runnable() {
                    public void run() {
                    }
                };
                try {
                    SwingUtilities.invokeLater(runner);
                    if (isMode1()) {
                        build();
                    }                                 
                    }
                }
                catch (InterruptedException ignoredException) {
                }
                catch (InvocationTargetException ignoredException) {
                }
     
            }
        }
    --
    Ludovic

  2. #2
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    Lol je ne vois pas trop non plus. D'autant plus que ce Runnable ne fait rien du tout (je pense, g peut être raté une accolade)! Tu l'as chopé ou ce code?

  3. #3
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    EDIT: me suis fait avoir sur ces accolades... ca ne sert a rien...
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    à mon avis il manque des bouts dans le code !
    c'est un exemple qui te montre comment lancer un Thread qui fait des choses sans bloquer l'affichage

  5. #5
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par XSeb74
    à mon avis il manque des bouts dans le code !
    c'est un exemple qui te montre comment lancer un Thread qui fait des choses sans bloquer l'affichage
    oui, c'est tout à fait ça.
    Mais je ne comprends pas pourquoi est ce qu'il faut faire un Runnable qui ne fait rien! je ne vois pas la logique... A moins que je sois ....
    --
    Ludovic

  6. #6
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    En fait, je ne vois pas en quoi ce thread ne bloque pas l'affichage
    --
    Ludovic

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    cette commande :
    SwingUtilities.invokeLater(runner);

    dit de lancer le thread sans bloquer l'affichage.
    La il fait rien mais tu peux mettre des choses dans le run() et tout de suite ça devient plus interessant.

    si tu ne fait pas un invokelater, les affichage sont gelés tant que le thread lancé est pas fini et ça peux poser problème en cas de multifenêtrage.

  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
    Citation Envoyé par XSeb74
    cette commande :
    SwingUtilities.invokeLater(runner);

    dit de lancer le thread sans bloquer l'affichage.
    Non, pas vraiment...

    Ca veut dire que ça met en file d'attente dans l'EventDispatchThread (qui s'occupe de l'affichage) le Runnable que tu lui donnes en paramètre.

    Donc au contraire, si le Runnable est long à s'exécuter, il bloquera l'affichage...

    L'intérêt est que si son appel est fait à partir d'un autre Thread que l'EDT, et que le Runnable met à jour un affichage, sa mise à jour est "thread-safe" (respecte la règle du Thread unique pour la mise à jour de l'affichage).

    Mais là, bien sûr, avec un Runnable qui ne fait rien, ça ne sert à rien...

  9. #9
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    Donc, en fait, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SwingUtilities.invokeLater(runner)
    ne sert à rien! c'est ça?
    --
    Ludovic

  10. #10
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    Si, si une mise à jours de l'affichage est en cours, alors il ne lancera le thread que lorsque celle ci sera terminé. Cela evite de bloquer la mise à jour du dessin.

    EDIT: euh après relecture, j'ai pas l'impression d'avoir été clair

  11. #11
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par arasium
    Si, si une mise à jours de l'affichage est en cours, alors il ne lancera le thread que lorsque celle ci sera terminé. Cela evite de bloquer la mise à jour du dessin.

    EDIT: euh après relecture, j'ai pas l'impression d'avoir été clair

    J'ai pas compris! Désolé
    --
    Ludovic

  12. #12
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    En fait, des que Java veut modifier une interface Swing, il le fait via l'EDT (le thread dédié aux modif graphiques). Donc si toi dans ton thread, par exemple le main (qui à toujours son propre thread) tu demande de modifier un élément graphique, il peut y avoir un conflit car il se peut que lorsque tu demande la modif, l'EDT soit déja en train de modifier l'élément!

    Je pense que c un peu mieu la! Mais je ne suis pas un expert, ce te raconte ce que je pense avoir compris

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par arasium
    En fait, des que Java veut modifier une interface Swing, il le fait via l'EDT (le thread dédié aux modif graphiques). Donc si toi dans ton thread, par exemple le main (qui à toujours son propre thread) tu demande de modifier un élément graphique, il peut y avoir un conflit car il se peut que lorsque tu demande la modif, l'EDT soit déja en train de modifier l'élément!
    C'est tout à fait ca !

    Toutes les modifications des composants Swing devraient être effectué dans l'EDT (a quelques exceptions près, car certaines méthodes sont thread-safe et peuvent donc être utilisées depuis d'autre thread - voir la doc pour plus de détail).

    Pour exécuter du code dans l'EDT, on utilise SwingUtilities.invokeLater() qui mettre l'objet Runnable en file d'attente, et sera exécuté au plus tôt par l'EDT...

    A noter enfin que la plupart des méthodes des listener Swing sont appellé via l'EDT (actionPerformed(), mouseclicked(), etc.)

    Plus de détail : Threads et performance avec Swing par Romain Guy


    a++

    [edit] PS : mais dans ce cas l'utilisation d'un Runnable vide est inutile... d'où sors-tu ce code ???

  14. #14
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    OK, je comprends mieux!!!!

    Mais j'ai juste une petite question, supposons que je sois dans ce cas:
    J'ai un bouton et lorsque je clique, il m'exécute une méthode toto() qui faitune action et qui fait "tourner" une progressBar durant le travail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    toto(){
     
    //MISE EN ROUTE PROGRESS BAR
     
    //ACTION
    ....
     
     
    //ARRET PROGRESS BAR
    }
    Comment faire cela???
    Je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SwingUtilities.invokeLater(new Runnable(){
    void run(){
    toto();
    }
    }
    )
    --
    Ludovic

  15. #15
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    Dans ce cas, lors du clic sur le bouton, c'est la méthode actionPerformed qui est appelé (elle meme dans l'edt). Donc le problème est que toto va être appéle dans l'edt et donc toutes les modifs que tu vas demander vons être appelés aussi dans l'edt, mais ne se lanceront qu'apres.
    Par exemple, on suppose que toto affiche la barre, la fait avancer jusqu'a la moitié puis l'efface. Tu auras dans l'ordre:


    clic sur le bouton declenche dans l'edt:

    actionPerformed
    toto
    allumerBar (appelé par toto mais mise à la suite dans l'EDT)
    avancerBar (idem)
    effacerBar (idem)

    En fait, la plupart des actions de modification des composants swing font appel à invokeLater, donc si ta méthode est déja dans l'edt, les modification seront lancé après que ta méthode soit terminée.

    Le mieu est de faire dans actionPerformed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (new Thread(new Runnable(){public void run(){toto();}})).start();

  16. #16
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    Et le simple fait de mettre toto dans le thread, permettra à la barre de progression de continuer même durant l'ACTION.
    --
    Ludovic

  17. #17
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    Normalement oui car dans ce cas TOTO sera dans un nouveau thread, mais quant tu fera avancer ta barre avec progressBar.setValue(int i), la fonction setValue lancera les modification a faire dans l'EDT (un autre thread que celui de TOTO). Donc dans ce cas les deux thread tourne en parallèle! Pas de problème, l'affichage suit ce que demande TOTO.

    Si tu veut g un bout de code?

  18. #18
    Membre confirmé Avatar de menuge
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    727
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 727
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par arasium
    Normalement oui car dans ce cas TOTO sera dans un nouveau thread, mais quant tu fera avancer ta barre avec progressBar.setValue(int i), la fonction setValue lancera les modification a faire dans l'EDT (un autre thread que celui de TOTO). Donc dans ce cas les deux thread tourne en parallèle! Pas de problème, l'affichage suit ce que demande TOTO.

    Si tu veut g un bout de code?

    Ca je veux bien! Merci
    --
    Ludovic

  19. #19
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    244
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 244
    Points : 110
    Points
    110
    Par défaut
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    public void actionPerformed(ActionEvent actionEvent)
      {
    	    String actioncommand = actionEvent.getActionCommand();
    	    if (actioncommand == "Generer matrice")
    	    {
    	    	// l'action à effectuée est lancée sous forme de thread car
    	    	// elle est longue à effectuer et peux perturber l'affichage
    	    	new Thread() {
    	            public void run() {genereMatrice();}
    	        }.start();
    	    }
      }
     
    private void genereMatrice()
      {
    	ensembleBalisesAmont = new EnsembleBalises();
    	ensembleBalisesAval = new EnsembleBalises();
    	inversion=true;
     
        bureauMatrix.setWaitCursor(true);
     
        ensemblePourGeneration = bureauMatrix.getEnsemblePourGeneration();
     
        if(ensemblePourGeneration != null)
        {
          // un file pour récuperer le repertoire de travail
      	  File fileSauvegarde = ensemblePourGeneration.getDestination();
     
      	  urlFichierColonneDroite = fileSauvegarde.getParent()  
                                                   +File.separator+nomFichierColonneDroite;
      	  urlFichierColonneGauche = fileSauvegarde.getParent()
                                                   +File.separator+nomFichierColonneGauche;
          traitement();
          statusBarMatrix.clearProgressBar();
        }
        bureauMatrix.setWaitCursor(false);
      }
     
    private boolean traitement()
      {
        EnsembleBalises ensembleBalisesTemp;
     
        statusBarMatrix.setProgressBar(ensemblePourGeneration.
                                                  getGroupeAmont().size()+
      		           ensemblePourGeneration.getGroupeAval().size()); 
     
        // récupération de l'ensemble des balises en amont puis en aval
        for(FichierMatrix fichier:ensemblePourGeneration.getGroupeAmont())
        {
          statusBarMatrix.setLabel(fichier.getName());
          if(!ensembleBalisesAmont.ajouter(fichier)) return false;
          statusBarMatrix.incrementeProgressBar();
        }
        for(FichierMatrix fichier:ensemblePourGeneration.getGroupeAval())
        {
          statusBarMatrix.setLabel(fichier.getName());
          if(!ensembleBalisesAval.ajouter(fichier)) return false;
          statusBarMatrix.incrementeProgressBar();
        }
     
        if(!ensembleBalisesAmont.verification()) return false;
        if(!ensembleBalisesAval.verification()) return false;
     
        // génération des liens
        listLiaison=ensembleBalisesAmont.lier(ensembleBalisesAval);
     
        // on parcours la liste pour voir si il y a effectivement des liens
        for(Integer lien:listLiaison)
          if(lien != null)
          {
              inversion=false;
              break;
          }
    Si tu as quelque questions sur le code hésite pas car y a pas de commentaire

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    Ce post est fort interessant mais moi j'ai un probleme.

    Dans un thread je dois appeler une fonctione avec des parametres qui sont définis hors du thread.

    Dans ce cas la je fais comment pour appeler ma fonction qui vient d'une autre classe.

    En fait ma fonction copie un fichier par tranche de 1Mo et je voudrais donc creer une progresse bar qui avance pendant que le fichier se copie.

    Hors ma fonction à 2 parametre le fichier à copier et la fenetre, et la gros probleme erreur sur les variables.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/08/2007, 14h00
  2. Réponses: 9
    Dernier message: 03/07/2007, 11h44
  3. comprendre une partie du code
    Par mademoizel dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/02/2007, 11h40
  4. une partie du code a disparu
    Par recup dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 08/03/2005, 10h08
  5. Indenter une partie du code
    Par KooX dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2004, 17h38

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