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 :

Accès objet d'un Thread


Sujet :

Java

  1. #1
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut Accès objet d'un Thread
    Bonsoir

    Je souhaiterais savoir s'il est possible d'accéder à un objet lancer dans un thread.

    je m'explique, j'ai une class C_Chat_Emission qui étend la class Thread:

    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
     
    package CONTROLEUR;
     
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Scanner;
     
    public class C_Chat_Emission extends Thread
        {
        private PrintWriter out;
        private String message = null;
        private Scanner sc = null;
     
        public C_Chat_Emission(PrintWriter out) 
            {this.out = out;}
     
        public void run() 
            {
            sc = new Scanner(System.in);
     
            while(true)
                {
                System.out.println("Votre message :");
                this.message = this.sc.nextLine();
                this.sendMessage(this.message);
                //this.out.println(this.message);
                //this.out.flush();
                }
            }
     
        /**
         * Envoie un message au serveur
         * @param String message 
         */
        public void sendMessage(String message)
            {
            this.out.println(message);
            this.out.flush();
            }
        }
    je lance mon thread depuis un autre contrôleur:

    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
     
    package CONTROLEUR;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
     
    public class C_Chat extends Thread
        {
        private Socket socket;
        private PrintWriter out = null;
        private BufferedReader in = null;
        private Thread threadEmission, threadReception;
        private Boolean active = true;
     
        public C_Chat(Socket s)
            {this.socket = s;}
     
        public void run() 
            {
            try 
                {
                this.out = new PrintWriter(this.socket.getOutputStream());
                this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
     
                this.threadEmission = new Thread(new C_Chat_Emission(this.out));
                this.threadEmission.start();
                this.threadReception = new Thread(new C_Chat_Reception(this.in));
                this.threadReception.start();
     
                while(this.active)
                    {
                    if(!this.threadReception.isAlive())
                        {
                        System.out.println("interruption du thread: "+this.threadEmission.getName());
                        this.threadEmission.interrupt();
                        System.out.println("fermeture de la socket: "+this.socket.toString());
                        this.socket.close(); 
                        this.active = false; 
                        }
                    }
                System.out.println("interruption du thread: "+this.getName());
                this.interrupt();
                } 
            catch (IOException e) 
                {System.err.println("Le serveur distant s'est déconnecté !");}
            }
        }
    Je souhaiterais une fois lancé pouvoir agir sur mon objet, par exemple utiliser la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void sendMessage(String message)
    mais je ne vois pas comment faire.

    J'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.threadEmission.sendMessage("test");
    mais comme je m'y attendais ça ne fonctionne pas. Je ne trouve rien de précis sur ce sujet sur le net...

    Si quelqu'un a une piste une idée ...
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  2. #2
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    Slt.
    Je pense que les pipe sont une solution a ton problème (communication entre thread).

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Qu'est-ce qui ne fonctionne pas au juste ? Parce que je ne vois pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.threadEmission.sendMessage("test");
    ne "marcherait" pas.

    A mon avis tu n'as pas vu ton erreur qui te pousse a cette question. A savoir ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.threadEmission = new Thread(new C_Chat_Emission(this.out));
    Qui n'a pas lieu d'être car C_Chat_Emission extends thread. Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.threadEmission = new C_Chat_Emission(this.out);
    me semble plus approprié et t'exposera les methode de la classe C_Chat_Emission.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Merci pour vos réponses, je pense en effet que ton hypothèse est la bonne wax78... je test ça ce soir (dès fois quand c'est gros comme ça on ne voit rien )

    PS: j'aime bien ton avatar très Floydien
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Parfois un regard extérieur fait apparaitre l'évidence ca m'arrive souvent aussi. N'hésite pas si ce n'était pas la bonne hypothèse à revenir.

    Oui c'est un ancien rendus 3D que j'avais fait a l'époque, étant obnubilé par cette "aberration chromatique" floydienne (et les possibilité des raytracer), l'image originale doit trainer par ici
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Viduc Voir le message
    mais comme je m'y attendais ça ne fonctionne pas. Je ne trouve rien de précis sur ce sujet sur le net...
    Quand tu poses une question de ce type, c'est toujours bien de dire quelle est l'erreur exacte parce que ca creve pas toujours les yeux. Mais dons ton cas, threadEmission est un objet de la classe Thread. Or, cette classe ne possède pas de méthode public void sendMessage(String message). Je suppose donc que ton erreur est une erreur de compilation.
    Concernant le this.threadEmission = new Thread(new C_Chat_Emission(this.out));, comme soulevé par wax78, c'est inutile puisque C_Chat_Emission est deja de type Thread. Mais ce n'est pas la cause de ton probleme car Thread est un Runnable donc ca devrait marcher quand meme.
    Pour pouvoir accéder à la fonction sendMessage, il faut aussi changer le type de threadEmission par C_Chat_Emission (pareil pour threadReception).

    Bref, pour résumer, il y a donc 2 choses à faire :
    - changer le type de threadEmission et threadReception par leur type respectif
    - Ne pas utiliser un Thread inutile pour lancer ceux-ci

  7. #7
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    Vous m'excuseraient si je me trompe, mais dans le cas ou plusieurs processus sont lancés, chacun obtient ses ressources, mais ils ne peuvent communiquer entre eux (envoyer et recevoir des données entre eux) qu'a travers des protocoles, et les pipes en font partie.
    Cordialement Amine.

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Pour des processus c'est fort possible d'utiliser les pipes oui (ou une socket, ou des mémoire partagées etc), mais ici ce sont des threads en l'occurence.

    Un simple échange mémoire, s'il est fait de manière a éviter les problèmes de concurrence, peux fonctionner sans devoir sortir de gros moyen.

    Une simple list synchronisée marche par exemple.

    Tu pourrais aussi faire par socket si l'envie t'en disait.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    Je vais tester, en tous cas, merci beaucoup pour l'info
    Bonne chance

  10. #10
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    J'ai pas encore manipuler des threads ou des processus en JAVA, mais en c, que ça soit une communication entre thread, ou entre processus, il faut des protocoles.
    En tous cas, je vais tester et merci beaucoup

  11. #11
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Merci pour toutes vos réponses.

    Citation Envoyé par hwoarang Voir le message

    Bref, pour résumer, il y a donc 2 choses à faire :
    - changer le type de threadEmission et threadReception par leur type respectif
    - Ne pas utiliser un Thread inutile pour lancer ceux-ci
    C'était bien ça le souci, j'ai donc modifié les types et supprimer les thread qu'il y avait en trop et ça fonctionne impec

    pour info j'utilise un groupe de thread pour connecter mes clients et je type (setName) chaque thread à l'intérieur du groupe pour m'y retrouver et ça fonctionne nickel

    merci encore
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/10/2010, 02h51
  2. Réponses: 3
    Dernier message: 20/04/2010, 22h43
  3. [Threads]liste de mes objets de types threads
    Par comme de bien entendu dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 22/03/2006, 15h46
  4. [MFC] Objet COM et thread !?
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 13/12/2004, 18h33

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