IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Thread de gestion de téléchargements


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut 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 : 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();
    }
    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 : 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);
    	}
    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 !

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Le plus simple serait d'utiliser une LinkedBlockingQueue.

    • La méthode offer() se contente d'ajouter un élément dans la queue. Cela peut être appelé de n'importe quel thread sans problème (pas de blocage, thread-safe...)
    • Ensuite ton thread n'a qu'a se contenter de faire une boucle infini sur la méthode take(), qui bloquera tant qu'il n'y a rien dans la queue.
      Il sera ainsi réveillé dès qu'un élément sera ajouté dans la queue


    Exemple vite fait :
    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
    public class Uploader {
     
        private final BlockingQueue<File> queue = new LinkedBlockingQueue<File>();
        private final Thread thread = new Thread("uploader") {
            @Override
            public void run() {
                uploadFiles();
            }
        };
     
        public Uploader() {
            this.thread.start();
        }
     
        private void uploadFiles() {
            try {
                Thread thread = Thread.currentThread();
                while ( !thread.isInterrupted() ) {
                    File file = this.queue.take();
     
                    // Traitement sur "file"...
                    System.out.println("Deb transfer : " + file + " / thread " + thread.getName());
                    Thread.sleep(1000);
                    System.out.println("Fin transfer : " + file + " / thread " + thread.getName());
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
     
        public void add(File file) {
            this.queue.offer(file);
        }
     
        public void interrupt() {
            this.thread.interrupt();
        }
    }
    Il ne reste plus qu'à coder les updates graphiques et le code de transfert proprement dit


    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Points : 131
    Points
    131
    Par défaut
    Salut,

    Ta connaissance de java et de toutes ses possibilités m'étonnera toujours ! En effet, cela à l'air de correspondre parfaitement à ce que je cherche, je vais donc chercher essayer de retravailler mon code sur cette classe.

    Merci pour l'exemple aussi ! C'est plus que je n'en demandais !

Discussions similaires

  1. [FTP] Gestion de téléchargements
    Par soshin dans le forum Langage
    Réponses: 11
    Dernier message: 04/10/2007, 11h00
  2. Réponses: 5
    Dernier message: 14/02/2007, 17h06
  3. Thread de gestion d'un clavier
    Par Chen norris dans le forum SDL
    Réponses: 6
    Dernier message: 07/01/2007, 17h32
  4. Gestion des téléchargements avec javascript ?
    Par TheRedLed dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/09/2006, 19h27
  5. Gestion de téléchargement sécurisé...
    Par falcorth dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 18/12/2005, 23h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo