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

Concurrence et multi-thread Java Discussion :

[Débutant] La méthode Thread


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut [Débutant] La méthode Thread
    Bonjour,

    Je suis en train d'implémenter le Master Mind en réseau. Je vous explique d'abord ce que j'essaie de faire.

    Les deux joueurs essaient de trouver la combinaison choisie par l'ordinateur. Chacun à leur tour ils proposent une combinaison et j'aimerais que la combinaison choisie par le joueur1 s'affiche sur le plateau du joueur2 et vice-versa.
    J'utilise pour cela un Thread.
    A chaque couleur de billes, on a associé un numéro. Quand on appuie sur le bouton "valider la combinaison", les 4 numéros associés aux couleurs choisies par le joueur sont écrits sur un objet PrintWriter appelé out. Puis, dans la méthode run() du joueur2, je lis ces entiers et je change les composants nécessaires grâce à ces numéros, puis j'appelle la méthode repaint et rien ne se passe. Voilà mon problème dans ce sens là.

    Dans le sens joueur2 vers joueur1, je n'arrive pas à créer un PrintWriter. Quand je le fait j'ai des NullPointerException qui s'affichent.

    Je précise aussi que l'interface du joueur1 joue le rôle de serveur et l'interface du joueur2 joue le rôle de client.

    Voici mon code.
    Pourriez-vous m'indiquer mon erreur?

    Quand j'appuie sur "Valider la combinaison" chez le joueur1, voici une des instructions réalisées : celle qui écrit sur le PrintWriter out
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterfaceJoueur1.out.print(GestionPanneauDeJeu.CombinaisonJoueur[k]);
    Cette instruction se trouve dans une boucle.

    Voici le code de l'interface du joueur2 :

    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
    import javax.swing.*; 
    import java.awt.*; 
    import java.net.*; 
    import java.io.*;
    import java.awt.geom.*;
    import java.awt.event.*;
     
    class InterfaceJoueur2 extends JFrame implements Runnable, ActionListener
    {
     
        public static Valider Valider;
        private static JButton connection;
        public static JPanel panneauPrincipal;
        public static TextField textfield;
        public static PanneauDeSolutions panneauDeSolutions;
        private Socket socket;
        public static OutputStream out;
        public static InputStream in;
        Socket insocket;
        Thread thread;
     
        public static void main(String[] args)
        {
            new InterfaceJoueur2();
        }
     
        public InterfaceJoueur2()
        {
            setTitle("Master Mind");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Toolkit kit= Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            int hauteur = screenSize.height;
            int largeur = screenSize.width;
            setSize((largeur/9)*4 +250,(hauteur/25)*24+10);
            panneauPrincipal = new JPanel();
            panneauPrincipal.setBackground(Color.LIGHT_GRAY);
            panneauPrincipal.add(connection = new JButton("Connect"));
            panneauPrincipal.add(textfield = new TextField("127.0.0.1"));
            panneauPrincipal.add(new PanneauDeJeu());
            panneauPrincipal.add(panneauDeSolutions = new PanneauDeSolutions()); 
            panneauPrincipal.add(Valider = new Valider());
            panneauPrincipal.add(new PanneauDeBilles());
            getContentPane().add(panneauPrincipal);
            connection.addActionListener(this);
            setVisible(true);
            setResizable(false);
     
         }
     
        // Lire les infos provenant de l'autre joueur.
        public void run()
        {
            try{
                BufferedReader in = new BufferedReader(new InputStreamReader(insocket.getInputStream()));
                int k = 0;
                while (k != 4)
                {
                   GestionPanneauDeJeu.CombinaisonJoueur[k] = in.read(); 
                   GestionPanneauDeJeu.billesTableau.add(new Ellipse2D.Double(55*k+10, 65, 50, 50));
                }
                panneauPrincipal.repaint();
            }catch(Exception e){}
        }
     
        public void actionPerformed(ActionEvent e)
        {
            if(e.getSource() == connection)
            {
                try{
                    socket = new Socket(textfield.getText(), 8765);
                    textfield.setText("Connecting...");
     
                    in = socket.getInputStream();
                    out = socket.getOutputStream();
                    thread = new Thread(this);
                    thread.start();
                }catch(IOException ioe){textfield.setText("Pas connecté.");
                }catch (Exception c){
                    textfield.setText(c.getMessage());
                }
                if(socket != null && socket.isConnected()){
                    textfield.setText("Connecté");
                }
            }
       } 
    }
    Ce que je ne sais pas non plus, c'est quand le Thread est exécuté.
    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    si t'affiche ce que tu recoit du joueur1 est ce que tu obtient les valeurs transmises ?

    et si tu essayais les DataOutput/InputStream pour les transmissions ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    En fait, dans la méthode run() du joueur2, j'ai demandé qu'il m'affiche les numeros qu'il lisait ou bien d'afficher "rien à lire" dans le catch. Quand j'appuie sur le bouton pour connecter les ordi, il m'affiche "rien à lire" donc, il exécute la méthode run(). Puis, quand je choisis une combinaison chez le joueur1 et quand j'ai appuyé sur le bouton "valider la combinaison" rien de s'affiche dans le terminal. Ce qui veut dire que la méthode run() ne s'exécute pas chez le joueur2.
    Et je ne comprends pas pourquoi.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    ça s'execute mais apres avoir recu les 4 premiers nombres ça s'arrete.
    faut rajouter une boucle pour rester dans le run, mais j'en suis pas trop sur, peut etre que tu te reconnecte au client a chaque fois que tu envoit? :s

    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
     
    private boolean fin = false; // à mettre tout en haaaaut
     
        public void run()
        {
          while(!fin){
            try{
                int k = 0;
                while (k != 4)
                {
                   GestionPanneauDeJeu.CombinaisonJoueur[k] = in.read(); 
                   GestionPanneauDeJeu.billesTableau.add(new Ellipse2D.Double(55*k+10, 65, 50, 50));
                }
                panneauPrincipal.repaint();
            }catch(Exception e){}
          }
    }
    pour sortir du run, tu met fin à true

    il faudrait aussi mettre cette ligne dans l'actionperformed :
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    (je pense aussi que tu te trompe de socket)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Même avec la boucle dans la méthode run() ça ne marche pas. Pourtant, comme je ne mets jamais "fin" à true la boucle ne s'arrête jamais, donc quand j'appuie sur le bouton "valider" il y a quelque chose à lire et rien n'est lu car j'ai demandé que les numeros lus s'affichent dans le terminal et rien ne se passe.

    Je crois que c'est plutôt dans la méthode qui écrit sur "out" qui n'écrit rien.

    De toute façon, je compte faire un programme plus petit dont le but est de transférer un entier d'un ordinateur à l'autre. Comme ça je pourrai poster le code complet, car le code du master mind est trop long et on s'y perd vite.
    Ca sera ainsi plus simple pour trouver l'erreur

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Voilà, j'ai créé un petit programme qui permettra de trouver l'erreur plus facilement(du moins j'espère!).

    Dans un package, j'ai 4 classes : "InterfaceJoueur1", "PanneauDeBilles", "GestionPanneauDeBilles" et "Valider".
    Les 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
    import java.awt.*;
    import javax.swing.*;
    import java.net.*;
    import java.io.*;
     
    class InterfaceJoueur1 extends JFrame
    {
        ServerSocket socket;
        Socket insocket;
        static PrintWriter out;
        Thread thread;
        public static JPanel panel;
     
        public static void main(String [] args)
        {
            new InterfaceJoueur1();
        }
     
        public InterfaceJoueur1()
        {
            // Composants graphiques.
            panel = new JPanel();
            panel.setPreferredSize(new Dimension (500, 200));
            Valider Valider = new Valider(); // Constructeur et actionPerformed dans une autre classe.
            panel.add(Valider);
            panel.add(new PanneauDeBilles());
            getContentPane().add(panel);
            setVisible(true);
            pack();
     
            // Attend une connection.
            try{
                 socket = new ServerSocket(8765);
                 insocket = socket.accept();
                 out = new PrintWriter(insocket.getOutputStream(), true);
     
                }catch(Exception e) {e.getMessage();}
        }
     
    }
    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
    import java.awt.*;
    import javax.swing.*;
    import java.awt.geom.*;
     
    public class PanneauDeBilles extends JPanel
    {
        public PanneauDeBilles()
        {
            setPreferredSize(new Dimension(460, 70));
            setBackground(Color.LIGHT_GRAY);
            setBorder (BorderFactory.createLineBorder(Color.red, 3));
            addMouseListener (new GestionPanneauDeBilles.EcoutePanneauDeBilles2());
        }
     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
     
            int colonne= 0;
            while(colonne<8)
                {
                    GestionPanneauDeBilles.TableauCercle3[colonne] = new Ellipse2D.Double(colonne*55+10,10,50,50);
                    g2.setPaint(GestionPanneauDeBilles.NumeroCouleur(colonne));
                    g2.fill(GestionPanneauDeBilles.TableauCercle3[colonne]);
                    g2.setPaint(Color.BLACK);
                    g2.draw(GestionPanneauDeBilles.TableauCercle3[colonne]);
                    colonne++;
                }
            g2.setPaint(Color.BLUE);
            g2.draw(new Rectangle2D.Double(GestionPanneauDeBilles.NumColonne*55+7, 7, 55, 55));
            g2.setPaint(Color.BLACK);
     
     
        }
     
    }
    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
    import java.awt.*;
    import javax.swing.*;
    import java.awt.geom.*;
    import java.awt.event.*;
    import java.util.*;
     
    public class GestionPanneauDeBilles
    {
        public static Ellipse2D[] TableauCercle3 = new Ellipse2D[8];
        public static Ellipse2D billeCourante;
        public static int couleurCourante;
        public static int NumColonne;
     
        public static Color NumeroCouleur(int i)
        {
            Color couleur = new Color(0,0,0);
            if(i==0)couleur= Color.PINK;
            if(i==1)couleur= Color.GREEN;
            if(i==2)couleur= Color.YELLOW;
            if(i==3)couleur= Color.BLUE;
            if(i==4)couleur= Color.ORANGE;
            if(i==5)couleur= Color.MAGENTA;
            if(i==6)couleur= Color.CYAN;
            if(i==7)couleur= Color.GRAY;
            if(i==8)couleur= Color.WHITE;
            if(i==9)couleur= Color.RED;
            return couleur;
        }
     
        public static int getColonne(int x)
        {
            int k = 0;
            while(k<8 && !(k*55<=x & x<(k+1)*55) )
            {
                k++;
            }
            return k;
        }
         public Ellipse2D find(Point2D p)
        {
            for(Ellipse2D r: TableauCercle3)
            {
                if(r.contains(p)) return r;
            }
            return null;
        }
     
        public static int getCouleur(Point2D p)
        {
            int i=0;
            while( i<8 && TableauCercle3[i].contains(p)==false)
            {
                i++;
            }
            return i;
        }
     
           public static class EcoutePanneauDeBilles2 extends MouseAdapter
           {
     
            public void mouseClicked (MouseEvent event)
            {
              couleurCourante = getCouleur(event.getPoint());
              System.out.println(""+couleurCourante);
              NumColonne = getColonne(event.getX());
              InterfaceJoueur1.panel.repaint();
            }    
     
            }
    }
    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
    import javax.swing.*; 
    import java.awt.*;
    import java.awt.event.*;
     
    public class Valider extends JPanel
    {
        public JButton push;
        public static int compteurLigne = 10;
     
        public Valider()
        {
            setBackground(Color.LIGHT_GRAY);
            push = new JButton ("Valider la combinaison");
            push.addActionListener (new ButtonListener());
            push.setEnabled(true);
            add(push);
        }
     
        private class ButtonListener implements ActionListener
        {
     
            public void actionPerformed (ActionEvent event)
            {  
                InterfaceJoueur1.out.print(GestionPanneauDeBilles.couleurCourante);
            }   
     
        }
    }
    Dans un autre package, j'ai la classe InterfaceJoueur2 que 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
    import javax.swing.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.awt.event.*;
     
    class InterfaceJoueur2 extends JFrame implements ActionListener, Runnable
    {
        private TextField IP;
        private InputStream in;
        private Thread thread;
        private Socket socket;
        private TextField text;
        public static void main(String [] args)
        {
            new InterfaceJoueur2();
        }
     
        public InterfaceJoueur2()
        {
            JPanel panel = new JPanel();
            setPreferredSize(new Dimension(250, 150));
            JButton connection = new JButton("Connect");
            panel.add(connection);
            connection.addActionListener(this);
            IP = new TextField("127.0.0.1");
            panel.add(IP);
            JLabel label = new JLabel("La bille choisie est la bille numéro : ");
            panel.add(label);
            text = new TextField(10);
            panel.add(text);
            getContentPane().add(panel);
            setVisible(true); 
            pack();
     
        }
     
        public void actionPerformed (ActionEvent e)
        {
           try{
               socket = new Socket(IP.getText(), 8765);
               IP.setText("Connecting...");
     
               in = socket.getInputStream();
               thread = new Thread();
               thread.start();
            }catch(IOException ioe){IP.setText("Not connected.");}
             if (socket != null && socket.isConnected()){IP.setText("Connected");}
     
     
        }
     
        public void run()
        {
            try{
                int l = in.read();
                text.setText(""+l);
            }catch(Exception e) {System.out.println("rien à lire");}
        }
    }
    L'InterfaceJoueur2 connecte les ordi.
    A chaque bille de l'InterfaceJoueur1 est associé un numéro de 0 à 7. Quand on clique sur une bille la méthode MouseClicked met le numéro associé à cette bille dans la variable "couleurCourante". Quand on clique sur "valider", on écrit la valeur de billeCourante dans "out".
    Je voudrais que cette valeur s'affiche dans la TextField de l'InterfaceJoueur2, mais rien ne se passe. Je ne comprends pas pourquoi.
    Si quelqu'un pouvait m'aider se serait sympa.
    Déjà merci

Discussions similaires

  1. [Débutant] JButton et Thread
    Par ViRouF dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/01/2007, 09h24
  2. [C#] question de débutant sur les threads?
    Par Jayceblaster dans le forum C#
    Réponses: 6
    Dernier message: 27/11/2006, 10h52
  3. [Débutant] Pb synchronisation thread
    Par Tymk dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 27/11/2006, 00h59
  4. Réponses: 1
    Dernier message: 09/08/2006, 16h04
  5. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 11h31

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