[JAVA]Probleme de Thread

Probleme de Thread [JAVA] - Java - Programmation

Marsh Posté le 11-02-2004 à 21:27:26    

Probleme resolu et projet quasiement finis mais j'ai une autre question ici : http://forum.hardware.fr/forum2.ph [...] =1#t659699
 
 
Bonjour, j'ai un probleme avec un programme en Java.
En fait j'ai plusieurs voitures (qui sont chacune un Thread) en mouvement dans un espace, au bout d'un moment j'en ai une qui s'arrete un temps aleatoire puis qui repart.
Je voudrait que ce thread s'arrete mais que pendant ce temps les autres voiture continu de bouger. Or si je fais un wait ou un sleep les autres voitures arretent de bouger elles aussi !
Je ne comprend pas pk, voila l'extrait du code concerné :
 

Code :
  1. int attente=alea.nextInt(10000); //durée que le thread attendra sur sa place
  2.   try
  3.   {
  4.    wait(attente);
  5.   }
  6.   catch(InterruptedException e){System.out.println("Erreur wait" );}

 
 
quelqu'un sait comment regler ce probleme ? C'est surement peu compliqué mais bon...


Message édité par Loizo le 29-02-2004 à 21:44:27
Reply

Marsh Posté le 11-02-2004 à 21:27:26   

Reply

Marsh Posté le 11-02-2004 à 21:35:59    

utilise Thread.sleep(attente) à la place de wait().


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 11-02-2004 à 21:39:09    

Ca me fait la meme chose avec sleep, j'avais oublié de le preciser :(

Reply

Marsh Posté le 11-02-2004 à 21:45:37    

Alors poste le code ou tu crée tes Threads.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 11-02-2004 à 21:48:30    

Le truc c que j'ai plein de classe et je vois pas vraiment quelle partie du code vous montrer qui pourrait vous aider.
 
Y a pas un moyen de mettre en pause un thread tout en laissant les autres s'executer ?

Reply

Marsh Posté le 11-02-2004 à 21:49:25    

ben si, avec Thread.sleep(). Donc si ca marche pas c'est que le problème est ailleurs..
Est-ce que par hasard tes Thread accederaient à des données partagées ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 11-02-2004 à 21:53:43    

Loizo a écrit :

Ca me fait la meme chose avec sleep, j'avais oublié de le preciser :(


 
coucou Loizo

Reply

Marsh Posté le 11-02-2004 à 21:57:03    

Ah ok, donc normallement avec sleep ca devrai marcher !  
Non mes threads sont des voitures qui se baladent sur un parking a la recherche d'une place donc ils n'ont pas de données partagées.
 
Edit : Salut EpoK :hello: C'est marrant de se retrouver ici !!
Je pose des questions pour mon projet la, je galere trop :(


Message édité par Loizo le 11-02-2004 à 21:57:45
Reply

Marsh Posté le 11-02-2004 à 22:01:35    

Loizo a écrit :

Ah ok, donc normallement avec sleep ca devrai marcher !  
Non mes threads sont des voitures qui se baladent sur un parking a la recherche d'une place donc ils n'ont pas de données partagées.
 
Edit : Salut EpoK :hello: C'est marrant de se retrouver ici !!
Je pose des questions pour mon projet la, je galere trop :(


 
pour ta deuxieme année de dut ? ca marche bien ?
 
combien de temps de projet ? c'est sur quoi ? un simulateur de parking ?  :D

Reply

Marsh Posté le 11-02-2004 à 22:03:21    

pour ton probleme faudrai qu'on voit ou tu crée tes thread pour voir si ils sont bien indépendant les uns des autres

Reply

Marsh Posté le 11-02-2004 à 22:03:21   

Reply

Marsh Posté le 11-02-2004 à 22:03:37    

EpoK a écrit :


 
pour ta deuxieme année de dut ? ca marche bien ?
 
combien de temps de projet ? c'est sur quoi ? un simulateur de parking ?  :D  


 
Ouais ma deuxiement année. C'est une simulation d'un parking. C'est avec du multiThread mais les threads c pas vraiment au programme on les voit tres peu donc on galere a mort. Faut le rendre dans 1 mois et demi :/
 
La je comprend pas pk le sleep met tout mon programme en pause :( Faudrait que je mette plus de code pour qu'on puisse m'aider mais je sais pas quoi mettre qui serai utile :/

Reply

Marsh Posté le 11-02-2004 à 22:05:10    

ben les lignes ou tu cree tes threads
la ou tu lance le run et tout koi ;)

Reply

Marsh Posté le 11-02-2004 à 22:06:06    

Je crée mes threads ici :
 

Code :
  1. public void StarThread(ParkingSim pS)
  2. {
  3.  d=new Dessin(g,Tab,TabPlace,pS);
  4.  d.setPriority(1); //Pour obliger le thread main a s'executer en premier
  5.  d.start();
  6.  for(int i=deb;i<Tab.size();i++)
  7.  {
  8.   ((CarreAnim)Tab.get(i)).setPriority(i+2); //pour que chaque voiture ai sa priorité
  9.   ((CarreAnim)Tab.get(i)).start();
  10.  }
  11.  if (premiereexe) deb=deb+2; //La 1ere fois 2 voitures entrent au meme moment
  12.  else deb++; // Apres juste une entre à la fois
  13. }


 
 
le Thread Dessin fait ceci : En fait il apelle la methode dessine de CarreAnim, les CarreAnim etant des threads representant les voitures
 

Code :
  1. public void run()
  2. {
  3.  try
  4.  {
  5.   sleep(2000); //Attend que la tache main finisse la dessin du parking pour s'executer
  6.   for(;;)
  7.   {
  8.    for (int i=0;i<Tab.size();i++)
  9.    {
  10.     ((CarreAnim)Tab.get(i)).dessine(g,TabPlace,i,pS);
  11.    }
  12.   }
  13.  }
  14.  catch(InterruptedException e) {System.out.println("Erreur run Dessin" );}
  15. }


 
Dans le run de CarreAnim j'incrente mes x et y pour faire bouger les voitures et dans dessine je redessine les voitures selon les coordonnées x et y calculés dans le run. Et ensuite si ma voiture a rejoint sa place c la que je fais le sleep() dont je vous parlez.
 
Vous voyez un peu le truc ou pas ?
 

Reply

Marsh Posté le 11-02-2004 à 22:08:09    

Loizo a écrit :


 
Ouais ma deuxiement année. C'est une simulation d'un parking. C'est avec du multiThread mais les threads c pas vraiment au programme on les voit tres peu donc on galere a mort. Faut le rendre dans 1 mois et demi :/
 
La je comprend pas pk le sleep met tout mon programme en pause :( Faudrait que je mette plus de code pour qu'on puisse m'aider mais je sais pas quoi mettre qui serai utile :/


 
tu le fait ou ton Thread.sleep(), dans ton thread principal ou dans le thread que tu veux arreter ?
 
pour le code je sais pas trop, mais si poste pas plus ca va etre de la devinette et tu pas trouver grand monde pour t'aider :/

Reply

Marsh Posté le 11-02-2004 à 22:09:07    

EpoK a écrit :


 
tu le fait ou ton Thread.sleep(), dans ton thread principal ou dans le thread que tu veux arreter ?
 
pour le code je sais pas trop, mais si poste pas plus ca va etre de la devinette et tu pas trouver grand monde pour t'aider :/


 
J'ai mit plus de code la, mais ca doit paraitre vraiment obscure quand on l'a pas fait soit meme :o  
T'es tjs en dut toi ?

Reply

Marsh Posté le 11-02-2004 à 22:10:37    

wait()
notify()
spa mieux?

Reply

Marsh Posté le 11-02-2004 à 22:12:48    

et t'as pas un synchronized qui traine ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 11-02-2004 à 22:15:46    

R3g a écrit :

et t'as pas un synchronized qui traine ?


 
La methode dessine de Carreanim est synchronized

Reply

Marsh Posté le 11-02-2004 à 22:40:14    

Alors a votre avis le probleme vient d'ou ?

Reply

Marsh Posté le 11-02-2004 à 22:48:57    

Loizo a écrit :

Alors a votre avis le probleme vient d'ou ?


 
niveau thread je toucha pas trop dzl  [:proy]  
 
 
sinon oué 2eme année :D trankilou koi
 
je part en stage dans 3 mois en irlande :D

Reply

Marsh Posté le 11-02-2004 à 22:50:31    

EpoK a écrit :


 
niveau thread je toucha pas trop dzl  [:proy]  
 
 
sinon oué 2eme année :D trankilou koi
 
je part en stage dans 3 mois en irlande :D


 
Cool :) Moi aussi ca se passe tranquillou le dut ;)
C'est bien le stage en Irlande, moi je fais ca classique sur Montpellier.
Bon je vais me coucher j'suis naze, merci a ceux qui m'ont aidé je m'y remet demain :p

Reply

Marsh Posté le 11-02-2004 à 23:57:37    

Sans avor plus de code on peut pas t'aider ...
 
En utilisant un debuggueur tu pourras facilement voir où tes threads sont arrêtés ...

Reply

Marsh Posté le 28-02-2004 à 20:50:45    

Bon j'ai trouvé l'erreur finalement, c juste que je ne mettais pas le sleep dans le run mais dans une autre methode...
 
Par contre j'ai une autre questions :
J'ai donc des voitures qui se deplacent grace à ma methodes run() qui incremente une variable x d'un certain deplacement nommé dep.
Or dans mes attributs j'en ai un private comme ceci :
private int dep=Panneau.Vitesse;
Vitesse etant un attribut public de panneau me servant a faire varier dep. Cependant lorsque je fais varier cet attribut panneau, la vitesse de deplacement des voitures deja crée ne varie pas, seule les nouvelles voitures entrant changent de vitesse... Quelqu'un comprend pourquoi ?
Note que si je remplace dans mon run() la variable dep par Panneau.Vitesse le changement est alors effectif meme pour les voitures deja en mouvements dans le parking...
 
????

Reply

Marsh Posté le 28-02-2004 à 21:18:07    

houlala ...
 
c'est évident : quand tu fais une affectation ca donne la valeur de ce qu'il y a à droite du '=' à la variable de gauche. Ca fait pas une association qui dure dans le temps : c'est juste une copie

Reply

Marsh Posté le 28-02-2004 à 21:29:30    

Ah... Ok je vois ce que tu veux dire :o J'y avais pas pensé du tout...
 
Mais je comprend pas trop pk sur le moment ma methode run() utilise l'ancienne valeur de dep et que je dois attendre qu'une nouvelle voiture entre pour avoir la nouvelle valeur.

Reply

Marsh Posté le 28-02-2004 à 21:30:34    

Loizo a écrit :

Mais je comprend pas trop pk sur le moment ma methode run() utilise l'ancienne valeur de dep et que je dois attendre qu'une nouvelle voiture entre pour avoir la nouvelle valeur.


ben c'est que t'as pas compris alors  :sweat:

Reply

Marsh Posté le 28-02-2004 à 21:34:49    

benou a écrit :


ben c'est que t'as pas compris alors  :sweat:  


 
lol je crois bien :D
 
Ouais en fait je comprend pas du tout, je change la valeur de l'attribut dep donc apres dans la methode run() il devrait utiliser la nouvelle valeur selon moi... :/
 
Y a pas moyen qu'il fasse cela ? Sinon je modifie dep par Panneau.Vitesse partout mais bon ca fait pas tres propre :(

Reply

Marsh Posté le 28-02-2004 à 21:37:32    

Loizo a écrit :

Ouais en fait je comprend pas du tout, je change la valeur de l'attribut dep donc apres dans la methode run() il devrait utiliser la nouvelle valeur selon moi... :/


où est ce que tu as vu que tu changais la valeur de dep ??
 
le plus simple c'est que tu créés un objet Vitesse et que toute les voitures fasse référence à cet objet. Comme ca quand tu change la veleur de cet objets, tous les objets qui accèdent à cet objet seront impactés

Reply

Marsh Posté le 28-02-2004 à 21:44:29    

benou a écrit :


où est ce que tu as vu que tu changais la valeur de dep ??
 
le plus simple c'est que tu créés un objet Vitesse et que toute les voitures fasse référence à cet objet. Comme ca quand tu change la veleur de cet objets, tous les objets qui accèdent à cet objet seront impactés


 
Ok merci je vais regarder ca de plus pres ;)

Reply

Marsh Posté le 28-02-2004 à 21:55:44    

En passant comme tu m'as l'air competent j'ai une autre question (tu m'aides plus que mon tuteur de projet alors j'en profite :p )
 
Je peut mettre en pause et reprendre mon programme grace à 2 boutons qui sont dans ma classe panneau (heritant de jPanel et implemenant ActionListener).
J'ai des attributs public qui sont lu dans ma Classe CarreAnim (comme pour dep et Panneau.Vitesse) et permettent selon leur valeur d'arreter ou de relancer le code mais j'ai un pb.
 

Code :
  1. public void run()
  2. {    synchronized (this)
  3.    {
  4.     if (Panneau.Pause) wait();
  5.    }


 
Ca c'est mon run() de CarreAnim (juste la partie importante) et voila la partie importante de Panneau :
 

Code :
  1. if(e.getActionCommand().equals("Pause" ))
  2.  {
  3.   Pause=true;
  4.  }


 
Mon probleme est le suivant : comment reveiller mes threads ???
Sachant que je ne peux créer d'instance de CarreAnim je n'arrive pas a reveiller mon run() une fois mis en pause.
Faudrait que je puisse utiliser un notify() dans panneau qui reveiller CarreAnim en fait mais je n'y arrive pas...
Surement qu'en m'y prennant comme ca c pas possible mais bon. J'ai essayé une methode trouvé dans un livre mais elle ne marche pas et sur le net je trouve pas vraiment de solution correspondant a mon cas ou alors je ne les comprend pas :/

Reply

Marsh Posté le 28-02-2004 à 22:02:26    

faut faire le notify sur l'objet sur lequel tu as fait wait [:spamafote]
 
donc soit tu fais un notify sur chacun de tes carreanim, soit dans careanim tu fais le wait sur un autre objet  (tjs le même) et dans panneau tu fais un notifyAll sur cet objet là.

Reply

Marsh Posté le 28-02-2004 à 22:07:32    

benou a écrit :

faut faire le notify sur l'objet sur lequel tu as fait wait [:spamafote]
 
donc soit tu fais un notify sur chacun de tes carreanim, soit dans careanim tu fais le wait sur un autre objet  (tjs le même) et dans panneau tu fais un notifyAll sur cet objet là.


 
Faire un notify sur chacun de mes carreanim je vois pas cmt faire.
 
Pour l'autre solution c possible de ne créer une classe vide qui me servirai juste pour faire synchronized(maclasse) et la je fais mon wait et comme ca dans panneau je crée une instance de maclasse et je fais le maclasse.notifyall ?
C'est un peu ca l'idée ?

Reply

Marsh Posté le 28-02-2004 à 22:11:00    

pas besoin de faire une nouvelle classe, juste d'une instance d'un objet quelquonque :
 
public Object CarreAnimSynchronizer = new Object();

Reply

Marsh Posté le 28-02-2004 à 22:11:37    

Ah ok je test de suite, merci bcp !!! :)

Reply

Marsh Posté le 28-02-2004 à 22:15:53    

Ca marche en partie !
C'est deja mieux en tout cas :p
 
En fait ca relance l'execution du programme, de nouvelles voitures se mettent a arriver mais les anciennes ne redemarrent pas elles restent en pause.
J'ai une erreur rouge par contre :
 
java.lang.IllegalMonitorStateException: current thread not owner
 

Code :
  1. if (Pause==true)
  2.   {
  3.    Pause=false; //J'enleve la pause pour la prochaine execution
  4.    CarreAnim.CarreAnimSynchronizer.notifyAll();
  5.   }


 

Code :
  1. public static Object CarreAnimSynchronizer = new Object();
  2. public void run()
  3. {
  4.   synchronized (CarreAnimSynchronizer)
  5.    {
  6.     if (Panneau.Pause) wait(); //Tant que j'ai choisis de mettre en pause la simulation je met en wait
  7.    }
  8. }

Reply

Marsh Posté le 28-02-2004 à 22:22:07    

mets la portion de code avec le notify() dans un bloc synchronized. Ton bloc de code doit être propriétaire du "verrou" (ou une notion dans le genre) sur le thread quand il exécute le notify() pour le réactiver.


Message édité par machinbidule1974 le 28-02-2004 à 22:25:57
Reply

Marsh Posté le 28-02-2004 à 22:27:39    

machinbidule1974 a écrit :

mets la portion de code avec le notify() dans un bloc synchronized. Ton bloc de code doit être propriétaire du "verrou" (ou une notion dans le genre) sur le thread quand il exécute le notify() pour le réactiver.


 
Ah ben oui c vrai, ca en plus je le sais :(
grrr :D
 
Edit :
J'ai tjs la meme erreur en fait, ca vient quand je clic sur le bouton Pause :
 

Code :
  1. java.lang.IllegalMonitorStateException: current thread not owner
  2. at java.lang.Object.wait(Native Method)
  3. at java.lang.Object.wait(Unknown Source)
  4. at CarreAnim.run(CarreAnim.java:97)


(ca en double) qui pointe vers la ligne if (Panneau.Pause) wait(); de CarreAnim
 
 
 
Resolu :p
En fait faut faire CarreAnimSynchronizer.wait(); :)
 
Merci tlm :)


Message édité par Loizo le 29-02-2004 à 00:13:39
Reply

Marsh Posté le 29-02-2004 à 21:43:45    

Bon j'ai quasiement finis mon projet, enfin disons que j'ai fais le plus gros. Merci bcp a tout ceux qui m'ont aidés :jap:  
Mon probleme principale actuellement c que comme je l'avais expliqué j'ai plusieurs voitures en mouvements dans mon parking mais elles se rentrent dedans... Mais j'aimerai eviter cela...
Je suis en train de reflechir au probleme mais je ne vois pas trop comment faire. Sachant que chaque voiture est un thread et que le nombre de voiture en mouvement au meme moment peut aller jusqu'a 32 et qu'elles ont un deplacement aleatoire ca me semble plutot compliqué... Deja comment une voiture peut etre detecter qu'elle va touche une autre voiture ?? En fait une fois que j'ai fais ca apres faut juste changer les trajectoires mais bon...
 
Vous avez une idée ??  :??:


Message édité par Loizo le 29-02-2004 à 21:44:01
Reply

Marsh Posté le 29-02-2004 à 21:54:32    

En fait pour developer mon post precedent, chaque voiture (et donc thread) et stocké dans un tableau, ce tableau permet d'avoir acces aux coordonnées x/y de la voiture.
Mon idée etait donc de parcourir a chaque deplacement de chaque voiture le tableau et verifier que le thread courant n'allait pas percuter une autre voiture par n'importe quel coté...
 
Mais ca me semble ultra lourd comme calcul !!
Y aura pas plus simple ??

Reply

Marsh Posté le 29-02-2004 à 22:38:40    

voici comment je ferai mais ça n'est peut-être pas une référence:
 
créer un objet de type PisteurDeVoiture ayant pour attribut un tableau de taille NxM d'objets voiture. Pour les coordonnées (x,y), on appelle une méthode getVoiture(int x, int y) qui appelle retourne le Thread de la voiture ou null. Chacun de tes threads va donc évoluer indépendemment des autres et remettre à jour cet objet PisteurDeVoiture qui devra être un singleton. Les threads devront être synchronisés pour ne pas avoir de collison dans la mise à jour de ton tableau... Aussi prévoir une méthode setVoiture(Voiture voiture, int x, int y)...
 
Bref, tu vois le topo..


Message édité par machinbidule1974 le 29-02-2004 à 22:39:15
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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