Bonjour,
Je suis actuellement en train de réfléchir à un gestionnaire de téléchargements (ou plutôt d'upload) sur un logiciel.
Je voudrais pouvoir, quelque soit l'endroit où l'on se trouve dans le code, mettre un upload dans une file d'attente qui serait prise en charge par un Thread séparé (pour ne pas bloquer l'affichage notament).
De plus, je voudrais une petite fenêtre en bas à droite de l'écran (du style réception de mail avec outlook) qui affiche le fichier en cours de téléchargement, et surtout une erreur si un téléchargement échoue. Bien entendu cette fenêtre n'est visible que lorsqu'un téléchargement est en cours ou qu'un téléchargement a échoué et qu'une action utilisateur est requise.
Donc je voulais faire quelque chose qui ressemblerait à ca :
Un thread prend en charge la gestion de la liste et traite les téléchargements un par un.
Un singleton pour n'avoir qu'une seul instance du Thread
Un fonction qui permet d'ajouter un fichier en attente de téléchargement dans ce Thread
Une fonction qui effectue le téléchargement d'un fichier et qui met à jour la fenêtre (celle en bas à droite) vi SwingUtilities.invokeLater()... (enfin c'est un autre problème ca
Donc cela me paraissait bien, je commence a coder cette solution, J'ai donc ma fonction
la fonction wakeUp() s'occupe de relancer le téléchargement s'il n'y avait plus de fichier en cours.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 TransferManager.getInstance().add(File file) { boolean shouldWakeUp = false; if (waitingFiles.size()==0) shouldWakeUp = true; waitingFiles.add(file); if(shouldWakeUp) wakeUp(); }
et enfin j'ai un fonction
Donc avec cela je m'attendais à ce que cela fonctionne à peu près... que nenni, je me suis aperçu que la fonction add, malgré le fait de récuperer l'instance du TransferManager, s'éxecute dans l'EDT, et donc l'écran reste figé.
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 public void startTransfer() { System.out.println("sommes nous dans l'edt ? "+SwingUtilities.isEventDispatchThread()); // JDialog qui représente la fenêtre en bas à droite getDialog().setVisible(true); while(waitingFiles.size()!=0) { FileToTransfer toTransfer = waitingFiles.get(0); // mise à jour des élements de la fenêtre if (fileTransfer(toTransfer)) { try { // confirmation de transfert Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } waitingFiles.remove(0); } } getDialog().setVisible(false); }
Désolé pour la tartine mais j'essaie d'être le plus clair possible.
Pouvez-vous m'aider à trouver ou je me trompe ?
Merci d'avance !
Partager