Bonjour,

Je suis entrain de réaliser une application necéssitant un traitement qui peut être assez long. Pour connaître le nombre de traitement effectuer et encore restants, j'utilise une JProgressBar.

Voici un algorithme de ce traitement :

DEBUT
Définir la valeur max du JProgressBar et la mettre à 0
POUR CHAQUE traitements à effectuer (avec X : int)
--> les deux lignes ci-dessous sont dans une boucle FOR
Lancer X threads pour traiter X traitements à la fois
Incrémenter la JProgressBar de 1 x X

--> les lignes ci-dessous sont dans une boucle FOR
Attendre la fin des X threads
FIN POUR
FIN


Voici le code réalisant cet algorithme

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
public void startReader() {
    threadProgress = new Thread(this);
    threadProgress.start();
}
 
public void run() {
    vectorRSSFeeds = rssFeeds.getRSSFeeds();
    jProgressBarProcess.setMaximum(vectorRSSFeeds.size());
    jProgressBarProcess.setValue(0);
 
    int nbThreads = 0;
    // POUR CHAQUE flux RSS
    for(int i = 0; i < vectorRSSFeeds.size(); i++) {
        // Vider le vecteur de threads
        vectorThreads.clear();
 
        // Déterminer le nombre de threads à créer
        nbThreads = this.NB_THREADS;
        if(nbThreads > vectorRSSFeeds.size() - i) nbThreads = vectorRSSFeeds.size() - i;
 
        // Création des threads
        for(int j = 0; j < nbThreads; j++, i++) {
            vectorThreads.add(new ThreadURL(vectorRSSFeeds.get(j).getUrl())); // Classe héritant de Thread
 
            SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                   jProgressBarProcess.setValue(jProgressBarProcess.getValue() + 1);
                   System.out.println("--> " + Integer.toString(jProgressBarProcess.getValue()));
               } 
            });
 
            System.out.println(">> " + Integer.toString(i) + " - " + vectorThreads.get(j).getURL().getUrl());
            vectorThreads.get(j).start();
            try {
               vectorThreads.get(j).sleep(10);
            }
            catch(InterruptedException e) {
                System.err.println(e.getMessage());
            }
        }
 
        // Attendre la fin du traitement des threads créés
        for(int j = 0; j < nbThreads; j++) {
            try {
                System.out.println("<< " + Integer.toString(i) + " - " + vectorThreads.get(j).getURL().getUrl());
                vectorThreads.get(j).join();
            }
            catch(InterruptedException e) {
                System.err.println(e.getMessage());
            }
        }
    }
}
Normalement, si j'ai 50 traitements, je devrais avoir une barre de progression allant de 0 à 50, mais j'ai l'impression que des étapes sont sautées (uniquement au niveau de la JProgressBar, car les ThreadURL fonctionnent très bien)

Voici un exemple pour un dizaine 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
>> 0 - http://www.lefigaro.fr/rss/figaro_international.xml
>> 1 - http://presence -pc.com/ppcrss.xml
--> 1
--> 2
<< 2 - http://www.lefigaro.fr/rss/figaro_international.xml
<< 2 - http://presence -pc.com/ppcrss.xml
>> 3 - http://www.lefigaro.fr/rss/figaro_international.xml
--> 3
>> 4 - http://presence -pc.com/ppcrss.xml
--> 4
<< 5 - http://www.lefigaro.fr/rss/figaro_international.xml
<< 5 - http://presence -pc.com/ppcrss.xml
>> 6 - http://www.lefigaro.fr/rss/figaro_international.xml
--> 5
>> 7 - http://presence -pc.com/ppcrss.xml
--> 6
<< 8 - http://www.lefigaro.fr/rss/figaro_international.xml
<< 8 - http://presence -pc.com/ppcrss.xml
>> 9 - http://www.lefigaro.fr/rss/figaro_international.xml
--> 7
<< 10 - http://www.lefigaro.fr/rss/figaro_international.xml
Avec ">>" pour le début d'un traitement, "<<" pour la fin d'un traitement et "-->" pour la position de la JProgressBar.

Savez-vous comment faire pour que ma JProgressBar s'incrémente correctement du nombre de traitement ?

Merci