Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1594 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  attente de threads pour rendre la main + swing

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

attente de threads pour rendre la main + swing

n°872848
andOceans
AMGOD
Posté le 13-10-2004 à 23:57:10  profilanswer
 

Bonjour, j'ai beau chercher, je ne trouve pas comment faire.
 
Il s'agit d'une recherche de fichiers dans une arborescence, voici le bout du code incriminé :
 

Code :
  1. ...
  2. public void search() {
  3.  mainThread = new SearchThread(root);
  4.  mainThread.start();
  5.  try { mainThread.join(); }
  6.  catch (InterruptedException e) { e.printStackTrace(); }
  7. }
  8. class SearchThread extends Thread {
  9.  protected FileSystemModel root = null;
  10.  public SearchThread(FileSystemModel root) { super(); this.root = root; }
  11.  public void run() {
  12.   int nbChildren = root.getChildCount(root.getRoot());
  13.   for (int i = 0; i < nbChildren; i++) {
  14.    File f = ((File) root.getChild(root.getRoot(), i));
  15.    if (f.isFile()) { // On a un fichier
  16.     if (f.getName().matches(".*" + pattern + ".*" ))
  17.      addResult(f.getAbsolutePath());
  18.    } else { // On a un répertoire, on fait une recherche dedans
  19.     String s = f.getAbsolutePath();
  20.     new SearchThread(new FileSystemModel(s)).start();
  21.    }
  22.   }
  23.  }
  24. }


 
Or, là, il quitte rapidement la méthode search(), c'est normal car le thread principal (celui qui analyse l'arborescence directe du noeud root) s'est terminé. Or, ses fils continuent eux de fonctionner. Je voudrai que le mainThread rende la main quand tous ses fils soient terminés, mais je n'y arrive pas. Cependant, lors de la création d'un thread fils (quand on tombe sur un répertoire quoi), je ne veux pas que le parent direct attende son fils, utiliser des threads perdrait tous son sens.
 
Y'a t il une solution, ou dois je faire en séquentielle pour ne pas avoir de problème ?
 
Merci.


Message édité par andOceans le 14-10-2004 à 19:06:56
mood
Publicité
Posté le 13-10-2004 à 23:57:10  profilanswer
 

n°872874
Taz
bisounours-codeur
Posté le 14-10-2004 à 00:45:05  profilanswer
 

il faut que tu mémorises les thread qui tu créent et quand tu as fini de les lancer, tu les join

n°873351
andOceans
AMGOD
Posté le 14-10-2004 à 17:07:08  profilanswer
 

Je vois pas exactement ce que je dois faire avec ta réponse. Pour l'instant, j'ai fais ceci :

Code :
  1. ...
  2.    } else { // On a un répertoire, on fait une recherche dedans
  3.     // (récurrence)
  4.     String s = f.getAbsolutePath();
  5.     SearchThread t = new SearchThread(new FileSystemModel(s));
  6.     threads.add(t);
  7.     t.start();
  8.     try { t.join(); }
  9.     catch (InterruptedException e) {}
  10.    }
  11. ...


 
Mais là, mon textarea qui doit ajouter au fur et à mesure les path des fichiers trouvés (l'ajout se passe dans addResult), ainsi qu'un label indiquant quel chemin est en court de recherche, ne se mettent plus à jour (ainsi que le bouton 'recherche' sensé se griser etc.), sans doute le thread swing bloqué.
 
Hint ?


Message édité par andOceans le 14-10-2004 à 17:08:02
n°873353
Taz
bisounours-codeur
Posté le 14-10-2004 à 17:07:42  profilanswer
 

il faut que tu join __tous__ tes threads !

n°873357
andOceans
AMGOD
Posté le 14-10-2004 à 17:10:23  profilanswer
 

mainThread qui les joins direct après leurs lancement tu veux dire ? (comme ça, là, il les auras tous join, donc attendra qu'il se terminent tous.. si j'ai bien compris ;o)

n°873473
andOceans
AMGOD
Posté le 14-10-2004 à 19:05:00  profilanswer
 

Bon, en fait, j'ai utiliser un ThreadGroup, (en attribut, "searchThreads" ) comme ceci :
 

Code :
  1. } else { // On a un répertoire, on fait une recherche dedans
  2.     String s = f.getAbsolutePath();
  3.     t = new SearchThread(searchThreads, new FileSystemModel(s));
  4.     t.start();
  5.    }


et dans search(), une boucle (ca me parait pas très propre :\) :

Code :
  1. // Cherche ?yc?s, cherches ! (pas de pub hein !)
  2.  mainThread = new SearchThread(root);
  3.  mainThread.start();
  4.  try {
  5.   mainThread.join();
  6.   while (searchThreads.activeCount() > 0) {
  7.    Thread.yield();
  8.   }
  9.  }
  10.  catch (InterruptedException e) {
  11.   e.printStackTrace();
  12.  }


Le seul problème là, c'est que le thread swing a l'air bloqué, il n'ajoute pas visuellement mes résultats, et ne fait pas d'autres choses qu'il est sensé faire.. Y'a juste que quand la recherche est fini, hop, tout s'affiche normalement. J'ai été voir du côté de SwingUtilities, mais rien ne me convient j'ai l'impression.
 
Que faire ?

n°873618
nraynaud
lol
Posté le 14-10-2004 à 20:43:30  profilanswer
 

j'avais pas vu le swing dans le titre !!!!
 
y'a SwingWorker pour ça !!!!
http://java.sun.com/docs/books/tut [...] reads.html


---------------
trainoo.com, c'est fini
n°873731
andOceans
AMGOD
Posté le 14-10-2004 à 22:32:05  profilanswer
 

Ahhh, voilà !! C'est pile poil, au millimètres près ce qu'il me fallait ! Ca marche impecc' maintenant, trop merci !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  attente de threads pour rendre la main + swing

 

Sujets relatifs
un pti coup de mainjava swing modélisation UML avec MagicDraw
comment se rendre dans une textbox[C++] include de librairie et conseil sur structure de main
[Java] Comment rendre des boutons invisible (sous XP), mais actif ???fenetre d'attente sous VBA
Java & swing. Danses néo-fashion ou carburants applicatifs ?Interface d'attente pour un téléchargement facon Fileplanet
probleme client attente d'une connexion serverRendre récursive une fonction de listage.
Plus de sujets relatifs à : attente de threads pour rendre la main + swing


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR