Thread de gestion de téléchargements
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
Code:
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();
} |
la fonction wakeUp() s'occupe de relancer le téléchargement s'il n'y avait plus de fichier en cours.
et enfin j'ai un fonction
Code:
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);
} |
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é.
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 !