Thread

sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis débutant en multi-threading, je programme en Java.
J'ai d'un coté 1 interface graphique, et d'autre coté un processus utilisateur. Dans l'interface graphique il y a 1 JProgressBar qui indique la progression du calcul utilisateur.

Je me suis fortement inspiré de l'exemple suivant :
https://rom.developpez.com/java-swingworker/

Pour faire simple, j'ai :

class MaClasse extends JPanel {
      public void okActionPerformed(ActionEvent e)
            MonSwingWorker sw = new MonSwingWorker();
            sw.execute();

            wait();
 
            // ici : le infos doivent etre collectées !
            Info informations = sw .getInformations();

            System.out.println(informations.size());
      }

     public class MonSwingWorker() extends SwingWorker {
           public void scan(fichier);// scan d'un fichier ligne par ligne

          protected Void doInBackground(){
                 scan(fichier);
                 notify();
          }
      
          protected void done() {// appelée à la fin
		 System.out.println("Done");
          }
     }
}


Alors mon problème est que il faut que sw ai collecté toutes les infos du fichier avant de continuer. Si je ne mets pas de notify et wait , la tâche est trop longue et les info n'ont pas le temps d'etre calculées (informations.size() = 0)

Quand je mets notify et wait, la tâche calcule bien les info ("Done" affiché), mais le processus principal ne reprend pas la main (par d'affichage de "informations.size()...". J'ai essayé avec un notifyAll(), mais le problème reste le même.

Avez vous une idée d'ou cela peut provenir ? Ca ne doit pas etre hyper compliqué, mais ça m'échappe...
Merci d'avance pour votre aide.
A voir également:

3 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Je pense qu'il faut séparer l'appel au thread de l'attente et de la récupération de l'information. C'est à dire faire au moins une fonction de plus.
0
sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   59
 
Merci d'avoir répondu. Cependant, je ne vois pas en quoi faire 1 fonction supplémentaire changerai quelque chose (je suis débutant). J'ai d'ailleurs essayé, et ça ne semble pas fonctionner.
Plus précisément, que ferait cette autre fonction ?

Merci d'avance pour votre aide.
0
sebastien61 Messages postés 495 Date d'inscription   Statut Membre Dernière intervention   59
 
Je me permets de faire un petit UP, car la réponse de Char Sniper ne m'aide pas vraiment.
Merci d'avance pour votre aide.
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Je suis un peu ignorant en JAVA, mais la programmation d'interface graphique, se fait en général à partir de signaux et de connection.
Donc, le schéma de base c'est de lancer un thread qui effectue une tâche de manière séparé, ainsi tu conserve la main sur ton programme principal.
Lorsque le thread se termine il envoie un signal qui sera capter par le programme principal et terminera ce qu'il y a à faire (ce que je voulais dire par créer une nouvelle fonction).
Le problème du "wait()" c'est qu'il est bloquant, il ne faut pas utiliser cette fonction de cette manière.
Je ne peux pas être plus concret à cause du Java, mais l'idée est là.
0