Bonjour,
Dans mon programme, j'ai implémenté une fonction de fragmentation de fichiers qui peut prendre un certain temps d'exécution en fonction de la taille du fichier à fragmenter. J'ai donc voulu ajouter une ProgressBar pour indiquer l'avancement de la fragmentation, et mise à jour à partir du SwingWorker qui se charge du traitement en arrière plan.
Le problème c'est que ma ProgressBar est actualisé une seule fois durant une fragmentation de fichiers. Par exemple, vous voulez fragmenter un fichier en 4 morceaux, la ProgressBar indiquera 25% puis 100% une fois le traitement fini.
En affichant dans la console l'état du "PropertyChangeEvent", je n'ai qu'un seul "Progress" qui est remonté les autres sont tous à l'état de "State".
Je ne comprends pas pourquoi.
J'ajoute bien un écouteur sur ma ProgressBar dans le constructeur de mon SwingWorker :
J'appelle ma fonction de fragmentation pour qu'elle s'exécute en arrière plan.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // Ecouteur sur la barre de progression addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent pce) { System.out.println("proper val : " + pce.getPropertyName()); if ("progress".equals(pce.getPropertyName())) { // Mise à jour de la valeur de la barre de progression IHM.barre.setValue((Integer) pce.getNewValue()); } } });
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 @Override protected Void doInBackground() throws Exception { System.out.println("Decoupage doInBackground"); setProgress(0); fragmentation(); return null; }
Enfin voici ma fonction de fragmentation dans laquelle je tente de mettre à jour ma ProgressBar à chaque fragment de créé (setProgress)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 // Méthode qui se charge de fragmenter les fichiers public void fragmentation () { long start = System.currentTimeMillis(); String cheminDestinationFragment, nomFragment; long tailleFichier, tailleFragment, bytesLus, bytesEcrits; File fragmentCree; double valBarreProgression; int valStartProgress = 0; // Parcours des fichiers à fragmenter for (int i = 0; i < cheminFichiersADecouper.size(); i++) { try { // Compteur des données lues bytesLus = 0; // Ouverture d'un flux de données en "Lecture" sur le fichier à fragmenter FileInputStream fis = new FileInputStream(cheminFichiersADecouper.elementAt(i)); DataInputStream dis = new DataInputStream(fis); // Récupération de la taille du fichier à fragmenter tailleFichier = fis.available(); System.out.println("taille fichier : " + tailleFichier); // Taille des fragments à créer selon la saisie utilisateur tailleFragment = tailleFichier/nbFragmentsDecoupe; System.out.println("Taille Fragment : " + tailleFragment); // Récupération de l'emplacement de création du fragment (même que le fichier source) cheminDestinationFragment = getDestinationFragment(i); System.out.println("Chemin fichier : " + cheminDestinationFragment); valBarreProgression = (100 - valStartProgress) / nbFragmentsDecoupe; System.out.println("VALBarreDépart : " + valBarreProgression); for (int j = 0; j < nbFragmentsDecoupe; j++) { nomFragment = getNomFragment(i); //System.out.println("Nom fragment : " + nomFragment); valStartProgress += valBarreProgression; // Création du fragment généré fragmentCree = new File(cheminDestinationFragment, nomFragment); // Ouverture d'un flux de données en "Ecriture" sur le fragment généré FileOutputStream fos = new FileOutputStream(fragmentCree); DataOutputStream dos = new DataOutputStream(fos); // Compteur des données écrites bytesEcrits = 0; while ((bytesEcrits < tailleFragment) && (bytesLus < tailleFichier)) { // Fragmentation du fichier source dos.writeByte(dis.readByte()); // Mise à jour des compteurs bytesLus++; bytesEcrits++; } dos.close(); // MAJ de la barre de progression setProgress((int)valBarreProgression); } dis.close(); // Suppression du fichier source File fichierSource = new File(cheminFichiersADecouper.elementAt(i)); fichierSource.delete(); } catch (FileNotFoundException e) { System.out.println("FileNotFoundException : " + e.getMessage()); } catch (IOException e) { System.out.println("IOException : " + e.getMessage()); } } long tempsTotal = System.currentTimeMillis() - start; System.out.println("Temps de la fragmentation : " + tempsTotal/1000); }
Je n'arrive pas à savoir d'où vient le problème, si quelqu'un pourrait m'aider à voir plus clair.
Merci.







Répondre avec citation
Partager