Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1245 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA]Probleme de Thread

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[JAVA]Probleme de Thread

n°639499
Loizo
Posté le 11-02-2004 à 21:27:26  profilanswer
 

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
mood
Publicité
Posté le 11-02-2004 à 21:27:26  profilanswer
 

n°639543
R3g
fonctionnaire certifié ITIL
Posté le 11-02-2004 à 21:35:59  profilanswer
 

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


---------------
Au royaume des sourds, les borgnes sont sourds.
n°639546
Loizo
Posté le 11-02-2004 à 21:39:09  profilanswer
 

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

n°639562
R3g
fonctionnaire certifié ITIL
Posté le 11-02-2004 à 21:45:37  profilanswer
 

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


---------------
Au royaume des sourds, les borgnes sont sourds.
n°639574
Loizo
Posté le 11-02-2004 à 21:48:30  profilanswer
 

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 ?

n°639575
R3g
fonctionnaire certifié ITIL
Posté le 11-02-2004 à 21:49:25  profilanswer
 

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.
n°639581
EpoK
Let's burn
Posté le 11-02-2004 à 21:53:43  profilanswer
 

Loizo a écrit :

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


 
coucou Loizo

n°639588
Loizo
Posté le 11-02-2004 à 21:57:03  profilanswer
 

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
n°639601
EpoK
Let's burn
Posté le 11-02-2004 à 22:01:35  profilanswer
 

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

n°639609
EpoK
Let's burn
Posté le 11-02-2004 à 22:03:21  profilanswer
 

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

mood
Publicité
Posté le 11-02-2004 à 22:03:21  profilanswer
 

n°639610
Loizo
Posté le 11-02-2004 à 22:03:37  profilanswer
 

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 :/

n°639614
meumeul
Stay Heavy
Posté le 11-02-2004 à 22:05:10  profilanswer
 

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

n°639617
Loizo
Posté le 11-02-2004 à 22:06:06  profilanswer
 

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 ?
 

n°639622
EpoK
Let's burn
Posté le 11-02-2004 à 22:08:09  profilanswer
 

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 :/

n°639624
Loizo
Posté le 11-02-2004 à 22:09:07  profilanswer
 

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 ?

n°639627
meumeul
Stay Heavy
Posté le 11-02-2004 à 22:10:37  profilanswer
 

wait()
notify()
spa mieux?

n°639633
R3g
fonctionnaire certifié ITIL
Posté le 11-02-2004 à 22:12:48  profilanswer
 

et t'as pas un synchronized qui traine ?


---------------
Au royaume des sourds, les borgnes sont sourds.
n°639639
Loizo
Posté le 11-02-2004 à 22:15:46  profilanswer
 

R3g a écrit :

et t'as pas un synchronized qui traine ?


 
La methode dessine de Carreanim est synchronized

n°639685
Loizo
Posté le 11-02-2004 à 22:40:14  profilanswer
 

Alors a votre avis le probleme vient d'ou ?

n°639709
EpoK
Let's burn
Posté le 11-02-2004 à 22:48:57  profilanswer
 

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

n°639715
Loizo
Posté le 11-02-2004 à 22:50:31  profilanswer
 

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

n°639793
benou
Posté le 11-02-2004 à 23:57:37  profilanswer
 

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 ...

n°658814
Loizo
Posté le 28-02-2004 à 20:50:45  profilanswer
 

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...
 
????

n°658830
benou
Posté le 28-02-2004 à 21:18:07  profilanswer
 

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

n°658838
Loizo
Posté le 28-02-2004 à 21:29:30  profilanswer
 

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.

n°658844
benou
Posté le 28-02-2004 à 21:30:34  profilanswer
 

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:

n°658853
Loizo
Posté le 28-02-2004 à 21:34:49  profilanswer
 

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 :(

n°658860
benou
Posté le 28-02-2004 à 21:37:32  profilanswer
 

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

n°658869
Loizo
Posté le 28-02-2004 à 21:44:29  profilanswer
 

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 ;)

n°658878
Loizo
Posté le 28-02-2004 à 21:55:44  profilanswer
 

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 :/

n°658883
benou
Posté le 28-02-2004 à 22:02:26  profilanswer
 

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à.

n°658886
Loizo
Posté le 28-02-2004 à 22:07:32  profilanswer
 

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 ?

n°658889
benou
Posté le 28-02-2004 à 22:11:00  profilanswer
 

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

n°658890
Loizo
Posté le 28-02-2004 à 22:11:37  profilanswer
 

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

n°658894
Loizo
Posté le 28-02-2004 à 22:15:53  profilanswer
 

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. }

n°658898
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 28-02-2004 à 22:22:07  profilanswer
 

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
n°658903
Loizo
Posté le 28-02-2004 à 22:27:39  profilanswer
 

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
n°659699
Loizo
Posté le 29-02-2004 à 21:43:45  profilanswer
 

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
n°659706
Loizo
Posté le 29-02-2004 à 21:54:32  profilanswer
 

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 ??

n°659735
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 29-02-2004 à 22:38:40  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA]Probleme de Thread

 

Sujets relatifs
[JAVA] Image en Backgroundpseudo-frame en PHP, probléme
Problème requête SQL (Ms SQL 2000)problème avec smtp
[FlashMX 2004 action-SCRIPT] - probleme avec ComboboxProblème sur une expression régulière
[Résolu]nOOb, problème de class pathprobleme d'include
[Applet JAVA] Problème de thread qui ne rend pas la main[JAVA] probleme de thread
Plus de sujets relatifs à : [JAVA]Probleme de Thread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR