IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Thread : problème incompréhensible


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut Thread : problème incompréhensible
    Bonjour.
    Je me suis lancé dans la création d un petit casse brique.
    Dans celui ci, j'utilise une classe extends Thread pour gerer les deplacement de la balle.

    la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
     
    package model;
     
    import sun.audio.AudioPlayer;
    import main.Principale;
    import music.Musicothèque;
     
    public class Launch extends Thread {
     
    	private static int X;
    	private static int Y;
    	public static boolean stop;
    	public static String name;
    	public Launch()
    	{
    		//lancement de la balle par defaut :
    		X=2;
    		Y=-1;
    		stop=false;
     
     
     
     
    	}
     
     
    	 public void run() {
    		 Plateau.b.caught=false;
     
     
     
     
     
    		 while(!stop) {
     
     
     
     
            	 try {
    				Thread.sleep(2*Math.abs(X)+1,5);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
                 //collision plateau
            	 if(Plateau.b.getCoordonnee().getX()<=0)
            		 X=-X;
            	 if(Plateau.b.getCoordonnee().getX()>=500-Plateau.b.getSize())
            		 X=-X;
     
            	 if(Plateau.b.getCoordonnee().getY()<=0)
            		 Y=-Y;
            	 if(Plateau.b.getCoordonnee().getY()>=610-Plateau.b.getSize()) //perdu !     		 
            		 Principale.lose();
     
     
            	 //collision paddle (si la balle n est pas caught
            	 if(!Plateau.b.caught)
            	 {if(Plateau.b.getCoordonnee().getY()+Plateau.b.getSize()==Plateau.v.getCoordonnees().getY()&&Plateau.b.getCoordonnee().getX()+Plateau.b.getSize()>=Plateau.v.getCoordonnees().getX() &&Plateau.b.getCoordonnee().getX()-Plateau.b.getSize()<=Plateau.v.getCoordonnees().getX()+Plateau.v.getWidth() )
            	 {Y=-Y; ;
            	 Musicothèque.paddle();
            	 if(Plateau.b.getCoordonnee().getX()>Plateau.v.getCoordonnees().getX()+Plateau.v.getWidth()/2)
            		{if(X==-1) X=1;else X=X+1;}
            	 else
            	 { if(X==1) X=-1;else X=X-1;}
     
            	 }
            	 }
            	 //collison brique: 
            	 for(int cpt=0;cpt<Plateau.Blist.size();cpt++)
            	 {
            		 int test=Plateau.Blist.get(cpt).touch();
            		if( test != -1)
            	    {Principale.p.destruction(cpt);
            	     Musicothèque.brick();
            	     Plateau.pl.setScore(Plateau.pl.getScore()+5);
            		 if	(Plateau.Blist.size()==0){
     
            			 Principale.p.setClear(true);
            			 try {
     
    						Thread.sleep(1500);
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
     
            			 //lancement du niveau suivant:
            			 Principale.next();
            		 }
     
            	      if(test==0)
            			{
            				X=-X;
            			}
            			else Y=-Y;
     
            		}
            	 }
     
     
     
     
            	 System.out.println(name);
            	 //deplacement
            	 Plateau.b.setCoordonnee(new Coor(Plateau.b.getCoordonnee().getX()+X,Plateau.b.getCoordonnee().getY()+Y));
     
     
     
             }
     
    	 }
     
     
     
    }
    Je ne sais pas si la montré dans son integralité sert à quelque chose...
    Bref
    lors du premier niveau je crée une nouvelle instance de Launch que je stock dans une variable static de la classe Plateau (contenant la globalité des element du jeu).

    Je lance le Thread ainsi lors d un clique gauche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!Plateau.l.isAlive())
    			Plateau.l.start();
    Tout fonctionne Parfaitement.
    Quand le joueur perd une vie : je stoppe le thread et j en crée un autre qui devrait logiquement etre lancé avec le clique gauche de la meme maniere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Plateau.l.stop=true;
    	 Plateau.l=new Launch();
    mais la survient l erreur ! ce nouveau thread se lance tout seul ! deplus, la variable Plateau.b.caught est à true, alors qu avant la boucle principale de la methode run, on la met à false .

    J ai d'abord pensé que l ancien thread continué son execution ... car le code avant le while ne s execute pas, Mais pas du tout !!!

    en ajoutant une variable name à la classe launch et en lui assignant des valeurs differentes pour differencier les thread lors de l execution, je m appercois que c est celui tout juste crée : Plateau.l=new Launch();
    qui s est lancé ! alors qu a aucun moment je n utilise Plateau.l.start();


    Voila voila, j ai essayé d expliquer mon problème le plus clairement possible.

    Si vous lisez ces derniers mots j applaudis votre courage.
    En attente d'une solution à ce casse tête.
    Bien à vous et merci !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on peut voir le code qui manipule ce thread. C'est pas avec 3 malheureuses lignes qu'on trouvera

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut
    le problème c est que y en a un peu partout dans le programme .
    les voici :

    class principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
     
     
     
    public static void lose(){
     
     
     
     
     
    			if(Player.getLives()>0)
    			{
    				//...
     
    				Plateau.l.stop=true;
    				Plateau.l=new Launch();
     
    			}	
     
     
     
    		else
    		{
    			//...
    			Plateau.l.stop=true;
    			//...
     
    		}
    	}
     
     
    //charge le niveau suivant
    public static void next(){
     
     
    		// ...
     
    		Plateau.l.stop=true;
    		Plateau.l=new Launch();
     
    		//...
     
     
     
     
    	}
    Plateau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     
    public class Plateau extends Observable{
     
    	//...
    	public static Launch l;
    	//...
     
     
    	public Plateau(...)
    	{
    			l=new Launch();
    			//...
     
     
    	}
    Mouse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //gere les event souris
     
     
    public class Mouse extends MouseAdapter implements MouseMotionListener{
     
     
     
    			//...	
     
    	public void mousePressed(MouseEvent e){
    		if(e.getButton()==1)//si clique gauche
     
    			if(!Plateau.l.isAlive())
    			Plateau.l.start();
     
    	}
     
     
    }
    voila c est tout

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu ne dois pas utiliser des variables static dans la classe Launch.
    C'est toujours le même Thread qui est en cours d'exécution.
    Ton test sur le nom du Thread n'est pas bon : le nom est également en static donc partager entre toutes les instances.
    Lorsque tu mets stop=true, puis new Launch(), le premier Thread n'a pas le temps de sortir de la boucle avant que la nouvelle instance Launch ne remette la variable static commune stop à false. Donc le premier Thread ne se termine jamais.

    De plus tu dois repenser ton architecture : pourquoi construire un nouvel objet Launch à chaque fois ? Ce devrais être un changement d'état plutôt qu'une nouvelle instance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 67
    Par défaut
    mmhh je vois, j avais pas pensé à ca ^^

    J vais m y remettre, merci beaucoup

Discussions similaires

  1. Problème incompréhensible! Fichier + liste
    Par djsbens dans le forum C
    Réponses: 2
    Dernier message: 07/12/2005, 00h30
  2. Problème incompréhensible
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2005, 11h49
  3. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51
  4. [Thread]Problème de processus
    Par berg dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2005, 20h40
  5. Thread--> problème avec ThreadProc
    Par stof dans le forum MFC
    Réponses: 33
    Dernier message: 08/06/2005, 13h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo