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 -
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 :
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.
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:
- Thread
- Compte thread - Accueil - Réseaux sociaux
- Thread instagram c'est quoi - Accueil - Guide réseaux sociaux
- Thread - Guide
- Thread application - Télécharger - Réseaux sociaux
- [Python] Problèmes avec les thread - Forum Python
3 réponses
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.
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.
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.
Merci d'avance pour votre aide.
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à.
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à.
Plus précisément, que ferait cette autre fonction ?
Merci d'avance pour votre aide.