Probleme swing
Résolu/Fermé9 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 août 2009 à 13:08
10 août 2009 à 13:08
Bonjour,
Avant de répondre à ton problème qui semble être le suivant : "comment récupérer la valeur de mon interface pour la prendre en compte dans ma boucle", je voudrais souligner un point assez important sur l'utilisation des threads.
Un thread est fait pour être plus ou moins un programme indépendant du programme principal, chargé d'effectué pour la plupart du temps, une tâche bien précise.
Lorsque l'on souhaite lancer plusieurs thread à la fois (ou en décaler, peu importe), il faut alors instancier autant de fois qu'il le faut un objet de la classe threadée en question, et le lancer.
Dans ton cas, que fais-tu ?
Tu as ta classe (threadée ou non, j'imagine que oui puisque tu parle de thread et que tu utilise la méthode run()) dans laquelle tu as ta méthode 'run'. Dans cette méthode, tu appelle plusieurs une autre méthode chargée d'effectuer une tâche. Tu vois donc bien, que tu n'utilise qu'un seul objet (thread puisque ta classe semble être threadée) sur lequel tu appelle plusieurs fois la même méthode.
En aucun cas tu lance plusieurs thread dans ton programme.
Si tu veux lancer plusieurs thread, alors il faut externaliser cette boucle. Ton 'run' doit permettre de lancer le traitement en question, mais la boucle doit se faire dans une classe autre, qui instanciera à chaque passage de boucle un nouvel objet de ta classe thread et le démarrera.
Bref, c'était juste pour expliquer ce petit détail technique.
Pour ce qui est de la valeur à récupérer, rien de plus simple à priori si tant est que la partie du code où se trouve ta boucle puisse accéder aux éléments graphique de ton IHM afin de récupérer la valeur en question depuis le composant graphique (bouton, champ texte, etc.)
Ou alors, il faut que la méthode qui gère la boucle prenne en paramètre cette valeur, ainsi il ne te restera plus qu'à appeler cette méthode avec le bon paramètre.
Le mieux serait donc d'avoir plus ou moins l'ensemble de ton code et surtout l'organisation de tes classes (quelle classe a accès à quelle autre, dépendances inter classes, etc.)
Avant de répondre à ton problème qui semble être le suivant : "comment récupérer la valeur de mon interface pour la prendre en compte dans ma boucle", je voudrais souligner un point assez important sur l'utilisation des threads.
Un thread est fait pour être plus ou moins un programme indépendant du programme principal, chargé d'effectué pour la plupart du temps, une tâche bien précise.
Lorsque l'on souhaite lancer plusieurs thread à la fois (ou en décaler, peu importe), il faut alors instancier autant de fois qu'il le faut un objet de la classe threadée en question, et le lancer.
Dans ton cas, que fais-tu ?
Tu as ta classe (threadée ou non, j'imagine que oui puisque tu parle de thread et que tu utilise la méthode run()) dans laquelle tu as ta méthode 'run'. Dans cette méthode, tu appelle plusieurs une autre méthode chargée d'effectuer une tâche. Tu vois donc bien, que tu n'utilise qu'un seul objet (thread puisque ta classe semble être threadée) sur lequel tu appelle plusieurs fois la même méthode.
En aucun cas tu lance plusieurs thread dans ton programme.
Si tu veux lancer plusieurs thread, alors il faut externaliser cette boucle. Ton 'run' doit permettre de lancer le traitement en question, mais la boucle doit se faire dans une classe autre, qui instanciera à chaque passage de boucle un nouvel objet de ta classe thread et le démarrera.
Bref, c'était juste pour expliquer ce petit détail technique.
Pour ce qui est de la valeur à récupérer, rien de plus simple à priori si tant est que la partie du code où se trouve ta boucle puisse accéder aux éléments graphique de ton IHM afin de récupérer la valeur en question depuis le composant graphique (bouton, champ texte, etc.)
Ou alors, il faut que la méthode qui gère la boucle prenne en paramètre cette valeur, ainsi il ne te restera plus qu'à appeler cette méthode avec le bon paramètre.
Le mieux serait donc d'avoir plus ou moins l'ensemble de ton code et surtout l'organisation de tes classes (quelle classe a accès à quelle autre, dépendances inter classes, etc.)
Ok merci kij_82
je t'explique ce que je fais :
j'ai une IHM sur la quelle j'envoie des messages à un serveur via une socket
je voudrai envoyer plusieurs messages simultanément, d'où mon utilisation des threads.
sur l'IHM, je dois saisir le nombre de message que ke j'envoie, et la fréquence d'envoie.
je pensais faire une boucle for sur ( le nbre de message )
puis un sleep (toutes les X secondes)
puis j'execute çà plusieurs fois sur la meme machine.
j'ai une classe pour l'iHM, une classe socket avec ma methode EnvoieMessage(),
puis je fais une classe Thread dans la quelle je fais un run() sur
la methode envoieMessage de la socket.
peut etre que c'est pas la bonne façon de faire, je sais pas. alors merci pour ton aide.
je pense avoir été clair. sinon n'hésite pas à me poser de question.
je t'explique ce que je fais :
j'ai une IHM sur la quelle j'envoie des messages à un serveur via une socket
je voudrai envoyer plusieurs messages simultanément, d'où mon utilisation des threads.
sur l'IHM, je dois saisir le nombre de message que ke j'envoie, et la fréquence d'envoie.
je pensais faire une boucle for sur ( le nbre de message )
puis un sleep (toutes les X secondes)
puis j'execute çà plusieurs fois sur la meme machine.
j'ai une classe pour l'iHM, une classe socket avec ma methode EnvoieMessage(),
puis je fais une classe Thread dans la quelle je fais un run() sur
la methode envoieMessage de la socket.
peut etre que c'est pas la bonne façon de faire, je sais pas. alors merci pour ton aide.
je pense avoir été clair. sinon n'hésite pas à me poser de question.
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 août 2009 à 16:08
10 août 2009 à 16:08
Globalement c'est ce qu'il faut faire oui.
Je récapitule ce que tu as dit avec ce que j'ai dit, cela doit donner ceci :
- 1 classe IHM de laquelle :
- tu récupère la valeur de ton champ pour savoir combien de thread tu vas lancer.
- tu boucle n fois en faisant :
+ j'instancie un nouveau thread
+ je le lance
- 1 classe threadée, avec un méthode run() qui appelle ta fonction de communication avec le serveur
- 1 classe socket avec la fonction de communication qui sera utilisée par la classe threadée.
Au besoin, si tu n'y arrive pas, post le code des classes concernées, je jetterai un oeil dessus.
Je récapitule ce que tu as dit avec ce que j'ai dit, cela doit donner ceci :
- 1 classe IHM de laquelle :
- tu récupère la valeur de ton champ pour savoir combien de thread tu vas lancer.
- tu boucle n fois en faisant :
+ j'instancie un nouveau thread
+ je le lance
- 1 classe threadée, avec un méthode run() qui appelle ta fonction de communication avec le serveur
- 1 classe socket avec la fonction de communication qui sera utilisée par la classe threadée.
Au besoin, si tu n'y arrive pas, post le code des classes concernées, je jetterai un oeil dessus.
oui c'est tout a fait cela.
mais là ou je comprend pas c'est :
+ j'instancie un nouveau thread
+ je le lance
parceque d'après ton 1er message, je ne lance pas plusieurs Threads dans le programme.
mais là ou je comprend pas c'est :
+ j'instancie un nouveau thread
+ je le lance
parceque d'après ton 1er message, je ne lance pas plusieurs Threads dans le programme.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 août 2009 à 16:41
10 août 2009 à 16:41
Si tu fais ceci à l'intérieur de ta méthode run() :
Et que tu appelles ton run() via l'instanciation / démarrage d'un objet de ta classe threadée comme ceci :
Tu vois bien que tu ne créé qu'une seule instance de ta classe threadée, et que cette instance va communiquer N fois via 'traitement' avec ton serveur, tout en s'endormant durant quelques temps entre chaque communication.
Cette utilisation n'est pas une utilisation correcte d'une classe threadée. Tu aurais très bien pu le faire dans une classe qui ne soit pas threadée (si tel est ton souhait de faire réellement comme ci-dessus)
Par contre, si tu souhaite utiliser la threading pour envoyer simultanément plusieurs communication au serveur et que chacune de ces communications soient "autonome", alors il te faut procéder de la manière suivante :
le code de ta méthode run() de ta classe threadée :
Et le code de la classe qui instancie N objet de ta classe threadée et les lance :
Avec cette facon de faire, tu auras N objet indépendant qui tenteront de communiquer plus ou moins en même temps avec ton serveur, chose que tu semblais vouloir faire au départ non ?
for (int i = 0; i < N; i++ ){ traitement(); sleep(); }
Et que tu appelles ton run() via l'instanciation / démarrage d'un objet de ta classe threadée comme ceci :
try{ (new MaClasseThreadée()).start(); }catch(...){ }
Tu vois bien que tu ne créé qu'une seule instance de ta classe threadée, et que cette instance va communiquer N fois via 'traitement' avec ton serveur, tout en s'endormant durant quelques temps entre chaque communication.
Cette utilisation n'est pas une utilisation correcte d'une classe threadée. Tu aurais très bien pu le faire dans une classe qui ne soit pas threadée (si tel est ton souhait de faire réellement comme ci-dessus)
Par contre, si tu souhaite utiliser la threading pour envoyer simultanément plusieurs communication au serveur et que chacune de ces communications soient "autonome", alors il te faut procéder de la manière suivante :
le code de ta méthode run() de ta classe threadée :
run(){ ... traitement(); ... }
Et le code de la classe qui instancie N objet de ta classe threadée et les lance :
for (int i = 0; i < N; i++){ (new MaClasseThreadée()).start(); }
Avec cette facon de faire, tu auras N objet indépendant qui tenteront de communiquer plus ou moins en même temps avec ton serveur, chose que tu semblais vouloir faire au départ non ?
Ok j'ai compris
au fait je fais mon thread à part,
puis je fais une classe qui instancie N objet de mon thread.
par exemple un truc com çà :
.....................
try{
if (monThread==null || !monThread.isAlive()) {
monThread = new MonThread();
monThread.start();
}
}catch(............){
.................
}
au fait je fais mon thread à part,
puis je fais une classe qui instancie N objet de mon thread.
par exemple un truc com çà :
.....................
try{
if (monThread==null || !monThread.isAlive()) {
monThread = new MonThread();
monThread.start();
}
}catch(............){
.................
}
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 août 2009 à 17:22
10 août 2009 à 17:22
Encore loupé :p
Si tu fais des threads, ce n'est pas pour les lancer un par un une fois que le précédent a terminé. Ou alors ne fais pas de thread.
Si tu fais une variable locale à ta boucle, et que tu conditionnes le lancement (après une nouvelle instanciation) du nouveau thread par des conditions sur l'ancien, c'est pas bon.
Dans ta boucle tu fais simplement :
Point. Rien de plus.
Si tu fais des threads, ce n'est pas pour les lancer un par un une fois que le précédent a terminé. Ou alors ne fais pas de thread.
Si tu fais une variable locale à ta boucle, et que tu conditionnes le lancement (après une nouvelle instanciation) du nouveau thread par des conditions sur l'ancien, c'est pas bon.
Dans ta boucle tu fais simplement :
try{ MonThread monThread = new MonThread(); monThread.start(); // --- Ou les deux lignes combinées : (new MonThread()).start(); }catch(............){ ................. }
Point. Rien de plus.