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
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)
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()); } } } }
Voici un exemple pour un dizaine traitement :
Avec ">>" pour le début d'un traitement, "<<" pour la fin d'un traitement et "-->" pour la position de la JProgressBar.
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
Savez-vous comment faire pour que ma JProgressBar s'incrémente correctement du nombre de traitement ?
Merci
Partager