Partage
  • Partager sur Facebook
  • Partager sur Twitter

Accéder à une variable dans un thread

Sujet résolu
Anonyme
    24 mai 2015 à 11:14:46

    Bonjour,

    j'ai besoin de votre aide :) je souhaite accéder à une variable qui se trouve dans un autre thread, et je ne sais pas comment faire. J'ai tenté de faire un accésseur et ensuite faire thread2.getVariable() mais cela ne fonctionne pas.

    Pourriez vous m'éclairer svp ?

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2015 à 19:26:58

      Bonjour.

      Que l'objet soit de type Thread ou autre, le principe est exactement le même :

      • si c'est une classe spécifique (classe qui hérite de Thread) alors il faut passer la valeur ou l'objet en paramètre au constructeur
      • si c'est une classe anonyme (ou lambda) alors tu peux l'utiliser directement si elle est constante (final).

      Montre nous un exemple simple qui ne fonctionne pas et on pourra surement t'expliquer pourquoi.

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
      Anonyme
        25 mai 2015 à 21:30:40

        Dans mon cas j'ai une classe qui hérite de Thread

        Mon probléme c'est que je stocke mes Thread dansune ArrayList, et je voudrais récupérer tous les objets (en l'occurence un objet "Balle") qui se trouve en tant que variable membre dans chaque Thread (pour l'affichage des balles)

        Voici une arborescence (je n'ai pas le code à ma disposition je suis désolé) :

        ----

        Class GestionBalle extends Thread

             new Balle();

            effectueTraitement();

         -----

        void tirer()

            listBalle.add(new Thread(GestionBalle));

         -----

        void afficherBalle()

            foreach(listBalle as threadBalle)

                  // Je souhaite récupérer l'objet Balle qui se trouve dans threadBalle

        --

        En espérant avoir été claire

        -
        Edité par Anonyme 25 mai 2015 à 21:35:28

        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2015 à 22:03:01

          class Balle {}
          
          class GestionBalle extends Thread {
              private final Balle balle;
          
              GestionBalle(Balle balle) {
                  this.balle = balle;
              }
          
              void effectueTraitement() {
              }
          
              Balle getBalle() {
                  return balle;
              }
          }

           Utilisation :

          class Toto {
              private List<GestionBalle> listBalle = new ArrayList<>();
          
              void afficherBalle() {
                  for (GestionBalle threadBalle : listBalle)
                      threadBalle.getBalle();
              }
          
              void tirer() {
                  Balle balle = new Balle();
                  listBalle.add(new GestionBalle(balle));
              }
          }
          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
          Anonyme
            26 mai 2015 à 9:44:01

            je vais essayer ça dans quelques heures :) j'avais déjà essayer de faire un getter (sans le mot clé final), et eclipse m'avait mis une erreur avant même de compiler
            • Partager sur Facebook
            • Partager sur Twitter
              26 mai 2015 à 10:55:11

              Ici class GestionBalle extends Thread mais cela fonctionnera parfaitement sans héritage, avec class GestionBalle !
              Si tu avais un problème de compilation, alors je pense que le problème n'était pas lié aux Threads mais plutôt à la conception de ton programme.

              • Partager sur Facebook
              • Partager sur Twitter
              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
              Anonyme
                27 mai 2015 à 17:03:15

                ce n'est pas extends Thread mais extends Runnable, petite erreur de ma part

                je te montre le code :

                public void shoot(double posXTir, double posYTir, ArrayList<Entity> EntityList, Niveau lvl, PanneauGame panGame) {
                
                	listBalle.add(new Thread(new Tirer(posXTir, posYTir, EntityList, lvl, panGame, this)));
                	int index = listBalle.size() - 1; // On recupere l'index du thread
                					  // inserer
                	listBalle.get(index).start(); // On lance le thread
                
                	Balle balle = listBalle.get(index).getBalle(); // marche pas
                
                
                    }
                class Tirer implements Runnable {
                
                	double posXTir;
                	double posYTir;
                	ArrayList<Entity> EntityList;
                	Niveau lvl;
                	PanneauGame panGame;
                	Player player;
                
                	private final Balle balle;
                
                	Tirer(double posXTir, double posYTir, ArrayList<Entity> entityList, Niveau lvl, PanneauGame panGame, Player player) {
                	    this.posXTir = posXTir;
                	    this.posYTir = posYTir;
                	    this.EntityList = entityList;
                	    this.lvl = lvl;
                	    this.panGame = panGame;
                	    this.player = player;
                	    balle = new Balle(posX, posY, 1, 10.0); // Nouvelle balle
                
                	}
                
                	public Balle getBalle() { // cette méthode ne fonctionne pas
                	    return balle;
                	}
                
                	public void run() {
                  
                
                	    while (true) {
                
                		// Actions
                	    }
                
                	}
                
                    }

                Merci de ton aide !


                -
                Edité par Anonyme 27 mai 2015 à 17:09:38

                • Partager sur Facebook
                • Partager sur Twitter
                  27 mai 2015 à 17:10:30

                  MisterBenoît a écrit:

                  ce n'est pas extends Thread mais extends Runnable, petite erreur de ma part

                  ou "implements Runnable", mais cela revient exactement au même, quelque soit la classe ou l'interface que tu hérites.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                  Anonyme
                    27 mai 2015 à 17:13:34

                    j'ai fais un edit dans mon message précédent, l'as tu vu ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mai 2015 à 22:41:17

                      "ne marche pas" : il faudrait détailler, dire l'erreur, ce que que tu attend, ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                      Anonyme
                        30 mai 2015 à 0:23:42

                        Au niveau de la ligne

                        Balle balle = listBalle.get(index).getBalle();

                        j'ai cette erreur : The method getBalle() is undefined for the type Thread

                        Alors que la méthode getBalle est bien dans ma classe Tirer 

                        Encore un fail : ce n'est pas exends Runnable mais implements Runnable désolé x)

                        -
                        Edité par Anonyme 30 mai 2015 à 0:24:15

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 mai 2015 à 12:08:39

                          Ah ok je vois, je n'ai pas exécuté le code chez moi.

                          Je vais te donner les pistes, car c'est un problème "bateau" que tu devras apprendre à résoudre seul.
                          Voici les étapes de déduction, les questions que tu dois te poser dans cette situation :

                          1. Sur quoi appelles-tu getBalle() ?
                            sur listBalle.get(index)
                          2. Que retourne get(index) ?
                            Un objet du type de listeBalle
                          3. listBalle est de quel type ?
                            List<Thread> j'imagine
                          4. Est-ce que le type Thread possède cette méthode getBalle() ?
                            Non
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                          Anonyme
                            30 mai 2015 à 12:12:16

                            Et justement mon problème est d'arriver à récupérer l'objet Balle qui se trouve dans ce Thread, et apparament je ne peux pas rajouter de méthodes à un thread

                            -
                            Edité par Anonyme 30 mai 2015 à 12:15:26

                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 mai 2015 à 12:31:26

                              La classe Thread a 2 façons de fonctionner : (voir code source du JDK, c'est simple)

                              • Tu lui passes un Runnable en paramètre et c'est ce qu'il exécutera.
                                C'est ce que tu as fait.
                                Ton problème : ton getBalle() n'est pas sur la classe Thread mais sur le Runnable qui est dans le Thread.
                                Solution : créer une classe héritant de Thread, lui ajouter getBalle2() (appelles la comme tu veux), qui se chargera de faire le getBalle() sur ton Runnable de type Tire.
                                Critique : tu auras 1 classe juste pour un getter, et tu auras surement à faire un cast.
                              • Tu redéfinies sa méthode run() (car Thread implémente Runnable).
                                Solution : ce que tu as mis dans dans ta classe Tirer se retrouveras dans ton Thread custom.
                                Critique : je trouve ça moche de devoir coupler le comportement d'un Thread avec une action d'un jeu.

                              Personnellement je ferai la 1ère solution.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                              Anonyme
                                30 mai 2015 à 13:43:33

                                J'avoue ne pas trés bien comprendre ton explication x)

                                J'ai compris qu'il fallait que je créé une classe héritant de Thread ayant le méthode getBalleBis()

                                mais je ne vois pas trop comment faire le reste, as tu un exemple de code ? Mercii :)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 mai 2015 à 14:09:21

                                  class Tire implements Runnable() {
                                      
                                  }
                                  
                                  class TireThread extends Thread() {
                                      final Tire tire;
                                      
                                      TireThread(Tire tire) {
                                          super(tire);
                                          this.tire = tire;
                                      }
                                      
                                      Tire getTire() {
                                          return tire;
                                      }
                                      
                                      Balle getBalle() {
                                          return tire.getBalle();
                                      }
                                  }
                                  
                                  // utilisation
                                  List<TireThread> listBalle = ...
                                  TireThread tireThread = listBalle.get(index);
                                  tireThread.getBalle(); // 1ère façon
                                  tireThread.getTire().getBalle(); // 2nd façon
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                  Anonyme
                                    2 juin 2015 à 14:53:37

                                    merci beaucoup, grâce à ton aide ça marche impec :)

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Accéder à une variable dans un thread

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown