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

avec Java Discussion :

Attendre la fin de traitement


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Attendre la fin de traitement
    Bonjour malgré mes recherches sur le forum et sur la faq je n'arrive pas à résoudre un problème, il s'agit plus d'un problème de compréhension qu'autre chose, je suis ultra débutant en java.

    • Dans mon application je réalise un traitement long ( parcourt et listing de répertoires ) qui me retourne une liste de fichier correspondant à un critère, pour cette partie aucun problème.
    • Cette opération étant relativement longue je l'ai mise dans un Thread pour éviter le blocage de mon application, et je lance un panel d'attente ( trouvé ici http://gfx.developpez.com/tutoriel/java/swing/wait/ ) le temps du traitement.


    ça fonctionne, sauf que pour la bonne exécution de mon programme je dois attendre le retour de ma recherche ( indiqué dans le premier point ), mais l'usage d'un thread ne me permet pas de récupérer la liste complète

    j'image ici le traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public ArrayList<File> traitement(File f, String r){		
    	Thread thread = new Thread() {
     
    		@Override
    		public void run() {
    			// affichage du panel d'attente
    			// parcourt récurssif des fichiers et ajout à l'arraylist
    			// fermeture du panel d'attente
    		}
    	};
    	thread.start();
    	return liste;
    }
    En regardant à droite et gauche je suis tombé sur join(), que j'ai appliqué à mon thread, la oui ma liste n'est retournée qu'a la fin de mon Thread, mais le panel d'attente du coup ne s'affiche plus.

    Comment dois je mis prendre pour attendre le résultat de ma recherche, et afficher mon panel d'attente ?

    Merci pour l'aide que les utilisateurs du forum pourront m'apporter.

  2. #2
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 282
    Points : 286
    Points
    286
    Par défaut
    Je vois pas vraiment pourquoi tu fais un Thread si tu attends ensuite que ton thread soit finit d'exécuter ?? Autant exécuter la méthode sans le Thread, tu n'auras plus ce problème:::

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    effectivement mais alors mon panel d'attente n'est plus animé, si j'ai bien compris mon traitement long bloque l'EDT donc mon panel n'est plus animé.

  4. #4
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 282
    Points : 286
    Points
    286
    Par défaut
    a oui c'est vrai, normalement pour faire propre il faut utiliser une methode wait() je crois, mais je en sais plus trop comment ca marche ..
    L'algorithme est un peu comme ca :
    - avec ton thread tu pose un verrou sur un objet
    - dans ta methode tu attend que le verrou se débloque (avec la méthode wait)

    Apres mes cours de java sont un peu loin, donc peut-être qu'il y a des méthodes plus simples maintenant ^^

  5. #5
    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,



    Déjà l'affichage du panneau d'attente ainsi que sa fermeture ne doivent pas être effectué dans ton thread. Cela doit être fait dans le thread graphique (donc l'EDT).

    Donc déjà ton code devrait plutôt ressembler à ceci :
    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
    	// Si la méthode est appellé depuis un evènement (actionPerformed() par exemple)
    	// on est dans l'EDT donc on peut mettre à jour notre interface graphique :
    	// 1. affichage du panel d'attente
     
    	Thread thread = new Thread() {
    		@Override
    		public void run() {
    			// 2. parcourt récurssif des fichiers et ajout à l'arraylist
     
    			// A la fin, on doit exécuter le code dans l'EDT pour mettre à jour l'UI :
    			SwingUtilities.invokeLater(new Runnable() {
    				@Override
    				public void run() {
    					// 3. fermeture du panel d'attente
    				}
    			});
     
    		}
    	};
    	thread.start();
    Avec Java 6 tu as la classe SwingWorker qui simplifie cela...



    Ensuite tu ne dois pas attendre la fin du traitement de ton thread, sinon cela va bloquer l'EDT et le problème restera le même...


    Il faut penser par événement : a la fin de ton traitement tu vas générer un évènement qui va fournir la liste à qui de droit.



    Mais pour plus d'info il faudrait plus de détail sur ton code...


    a++

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Voila le principe de mon application :

    * L'idée générale est de copier des fichiers ou des dossiers vers un répertoire que l'utilisateur va sélectionner.

    * Le fonctionnement pas à pas :

    - On prend un fichier et/ou un dossier qu'on lâche sur l'application ( j'utilise le drag and drop ).
    - En fonction de son extension l'application va lister des répertoires permettant à l'utilisateur de choisir la destination du fichier et/ou dossier droppé ( je suis pas sur que ce mot existe )
    - Une fois sélectionné une class se charge de copier ces données vers la destination choisie.

    * Dans le code :

    lors du importData ( de ma class étendue par TransferHandler ), je mets en place une boucle for en fonction du nombre de fichier ou dossier sélectionné.

    Dans cette boucle, je lance une première class listant les répertoires en fonction de l'extension du fichier ou du nom du dossier. ( déjà cette opération peut prendre du temps ).
    Il s'agit d'un listing récursif de répertoire.

    Si le résultat n'est pas null ( échappement par l'utilisateur ), je lance ma seconde class de copie, de la source ( fichier ou dossier droppé ) vers la destination ( sélectionnée par l'utilisateur ). ( cette opération peut prendre du temps également ).

    * Objectif : durant ces opérations mettre en attente l'utilisateur.

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/05/2013, 11h14
  2. [Toutes versions] Attendre la fin d'un traitement avant d'en commencer un autre
    Par nietzsche64 dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/12/2011, 09h11
  3. [XL-2003] Attendre la fin d'un traitement
    Par hunteshiva dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/09/2011, 22h22
  4. [Servlet][Submit]Attendre la fin du traitement pour charger la page
    Par leminipouce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2008, 18h38
  5. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 16h35

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