attente de threads pour rendre la main + swing

attente de threads pour rendre la main + swing - Java - Programmation

Marsh Posté le 13-10-2004 à 23:57:10    

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
Reply

Marsh Posté le 13-10-2004 à 23:57:10   

Reply

Marsh Posté le 14-10-2004 à 00:45:05    

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

Reply

Marsh Posté le 14-10-2004 à 17:07:08    

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
Reply

Marsh Posté le 14-10-2004 à 17:07:42    

il faut que tu join __tous__ tes threads !

Reply

Marsh Posté le 14-10-2004 à 17:10:23    

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)

Reply

Marsh Posté le 14-10-2004 à 19:05:00    

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 ?

Reply

Marsh Posté le 14-10-2004 à 20:43:30    

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
Reply

Marsh Posté le 14-10-2004 à 22:32:05    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed