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 :

Traitement séquentiel algorithme (avec pas en ms)


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Par défaut Traitement séquentiel algorithme (avec pas en ms)
    Bonjour,

    J'ai un petit souci :

    J'ai besoin, pour les besoins de mon programme, de faire dérouler un algorithme pas à pas et d'en afficher chacune des étapes à l'écran (coloration de ronds ou de traits)

    J'ai tout d'abord essayé avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void Algo(){
        for( condition ){
           //instructions_algorithme
           composantGraphique.repaint();
           thread.sleep(pas);
       }
    }
    Or cela bloque completement l'affichage jusqu'à la fin de l'algo puis affiche tout d'un coup.

    J'ai ensuite essayé avec un SwingWorker mais sans grand succès , peut être que je ne sait pas l'utiliser correctement mais j'ai ensuite lu que les swingworker étaient utiles seulement pour le traitement parrallèle et non pour le traitement séquentiel.

    Quelques uns d'entre vous auraient-t-ils des idées pour réaliser ce type de traitement ?

    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 void AlgoGloutonEdges(long pas,Dessin cadre) throws InterruptedException {
            for (Edge e : listEdges) {
                ArrayList<Integer> usedColors = new ArrayList<Integer>();
                for (Edge succ : e.getRelations()) {
                    System.out.println(succ.getA().getName() + ":"
                            + succ.getB().getName());
                    if (succ.isColored()) {
                        usedColors.add(succ.getColor());
                    }
                }
                int color = 0;
                while (!(e.isColored() && color < colorList.length)) {
                    if (!(usedColors.contains(color))) {
                        e.setColor(color);
                        e.changeIsColoredOn();
                        cadre.repaint();
                        Thread.sleep(pas);
     
                    }
                    color++;
                }
            }
        }
    à noter que mon "Dessin cadre" est une classe qui extends JPanel et implements MouseListener et MouseMotionListener et qui gère l'affiche du graphe en fonction du model.

  2. #2
    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 : 46
    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 dois utiliser un swingworker pour lancer ton algo su un threa dséparé du thread d'affichage. Pour la mise à jour de l'affichage depuis ton algo, tu devra utiliser SwingUtilities.invokeAndWait()

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Par défaut
    merci , je vais essayer ! Je vous tiens au jus

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 10
    Par défaut
    Me revoila :

    J'ai un problème pour mettre un SwingWorker autour du lancement de l'algo :

    En effet , je n'arrive pas à visualiser où je dois me positionner :

    J'ai essayé ça

    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
     
    valider.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				model.clear();
    				cadre.repaint();
     
    //TEST et récupération de la variable pas du JTextfield
     
    SwingWorker worker = new SwingWorker() {
        protected Object doInBackground() throws Exception{
             // LANCER ALGORITHME(long Pas , Dessin cadre)
        }
     
       protect void done() {
            cadre.repaint(); 
            //Je repaint() une fois l'algo fini pour le fun
       }
    };
    }
    et rien ne se passe, éclipse m'affiche des erreurs mais sans pistes de solution à me présenter

    Ensuite dans le code de l'algo , je l'ai redéfini comme suit :
    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
     
    public void AlgoGloutonEdges(long pas,Dessin cadre) throws InterruptedException {
            for (Edge e : listEdges) {
                ArrayList<Integer> usedColors = new ArrayList<Integer>();
                for (Edge succ : e.getRelations()) {
                    System.out.println(succ.getA().getName() + ":"
                            + succ.getB().getName());
                    if (succ.isColored()) {
                        usedColors.add(succ.getColor());
                    }
                }
                int color = 0;
                while (!(e.isColored() && color < colorList.length)) {
                    if (!(usedColors.contains(color))) {
                        SwingUtilities.invokeAndWait(new Runnable() {   // ICI
                            public void run() {
                                e.setColor(color);
                                e.changeIsColoredOn();
                                cadre.repaint();
                                Thread.sleep(pas);
                           }
                        });
                    }
                    color++;
                }
            }
        }
    Le problème ici est que je ne peux pas utiliser ni pas , ni color , ni v ou alors je dois les passer en final et que je ne peux du coup plus les faire varier.

  5. #5
    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 : 46
    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
    éclipse m'affiche des erreurs mais sans pistes de solution à me présenter
    Ce serait bien de nous donner le message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                while (!(e.isColored() && color < colorList.length)) {
                    if (!(usedColors.contains(color))) {
                        SwingUtilities.invokeAndWait(new Runnable() {   // ICI
                            public void run() {
                                e.setColor(color);
                                e.changeIsColoredOn();
                                cadre.repaint();
                                Thread.sleep(pas);
                           }
                        });
                    }
                    color++;
                }
    Nondidjou, pas de Tread.sleep dans le thread graphique

    Pour le reste, simplement les passer en paramètre d'une méthodes:

    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 void update(finale Edge e, finale Color color){
    SwingUtilities.invokeAndWait(new Runnable() {   
                            public void run() {
                                e.setColor(color);
                                e.changeIsColoredOn();
                                cadre.repaint();
                           }
                        });
    }
    //.......
                    if (!(usedColors.contains(color))) {
                        update(e,color);
                        Thread.sleep(pas);
                    }

Discussions similaires

  1. [Tableaux] Délai de traitement d'une page pas assez long
    Par Alexlesilex dans le forum Langage
    Réponses: 14
    Dernier message: 15/05/2006, 17h40
  2. Traitement de chaine avec ksh
    Par chtite_maguette dans le forum Linux
    Réponses: 3
    Dernier message: 20/04/2006, 17h30
  3. VB - Traitement de chaine avec séparateur
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/12/2005, 13h23
  4. [RegEx] Pb traitement de chaînes avec les regex
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 00h00
  5. TRaitement de fichier avec PERL
    Par Dr_GonZO dans le forum Langage
    Réponses: 4
    Dernier message: 22/07/2005, 12h38

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