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] envoyer un message à ma classe principale


Sujet :

Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut [thread] envoyer un message à ma classe principale
    bonjour,


    dans ma classe principale je crée un thread puis je le démarre :
    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 MaClassePrincipale 
    {
    	private MonThread t = new MonThread();
    	public MaClassePrincipale()
    	{
    		t.start();
    	}
     
    	public void getMessage()	// action à réaliser lorsque la classe reçoit le message
    	{
     
    	}
     
    }
    Puis dans la méthode run() du thread, je réalise une série d'actions.
    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
     
    public class MonThread extends Thread
    {
        public MonThread(
        {
        }
     
        @Override
        public void run()
        {
    		fonction1();
    		fonction2();
    		fonction3();
    		fonction4();
     
    		SendMessage() // Envoi du message vers la classe principale 
     
    		fonction5();
    		//...
    		fonctionN();
        }
    }


    Et je voudrais pouvoir envoyer à un moment donné un message à ma classe principale :
    avoir une fonction du genre SendMessage() dans le thread et une fonction du genre getMessage dans la classe principale.

    A priori, notify() et wait() ne répondent pas à mon besoin, car ce sont des fonctions qui réveillent ou endorment un thread.


    Vous ne voyez pas comment je pourrais faire ?

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    est ce que getMessage() est une attente bloquante? si oui: PipedInputStream PipedOutPutStream ...
    sinon passe une référence de l'objet à prévenir au Thread... après on peut faire plus découplé avec un équivalent de Observer/observable, etc...
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    est ce que getMessage() est une attente bloquante? si oui: PipedInputStream PipedOutPutStream ...
    Dans ce cas là, il vaut mieux viser la blockingQueue, au moins tes messages seront des objets


    Sinon, code simple pour appeler ta classe 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
    public class MaClassePrincipale 
    {
    	private MonThread t = new MonThread(this);
    	public MaClassePrincipale()
    	{
    		t.start();
    	}
     
    	public void getMessage(.....)	// action à réaliser lorsque la classe reçoit le message
    	{
     
    	}
     
    }
    public class MonThread extends Thread
    {
        MaClassePrincipale c;
        public MonThread(MaClassePrincipale c)
        { this.c=c; }
     
        @Override
        public void run()
        {
    		fonction1();
    		fonction2();
    		fonction3();
    		fonction4();
     
    		c.getMessage(message) // Envoi du message vers la classe principale 
     
    		fonction5();
    		//...
    		fonctionN();
        }
    }

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    est ce que getMessage() est une attente bloquante?
    non je ne souhaite pas faire d'attente bloquante, pour ne pas bloquer le programme justement.



    Citation Envoyé par tchize_ Voir le message
    Sinon, code simple pour appeler ta classe 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
    public class MaClassePrincipale 
    {
    	private MonThread t = new MonThread(this);
    	public MaClassePrincipale()
    	{
    		t.start();
    	}
     
    	public void getMessage(.....)	// action à réaliser lorsque la classe reçoit le message
    	{
     
    	}
     
    }
    public class MonThread extends Thread
    {
        MaClassePrincipale c;
        public MonThread(MaClassePrincipale c)
        { this.c=c; }
     
        @Override
        public void run()
        {
    		fonction1();
    		fonction2();
    		fonction3();
    		fonction4();
     
    		c.getMessage(message) // Envoi du message vers la classe principale 
     
    		fonction5();
    		//...
    		fonctionN();
        }
    }
    oui effectivement, j'avais pensé à faire ceci.


    Mais je me demandais s'il n'y avait pas moyen de faire communiquer deux objets sans être obligé de passer une référence de l'un à l'autre ?

    Par exemple, le thread déclencherait un événement qui serait traité dans ma classe principale. J'ai pensé aux AbstractAction.

    Je me demande si je ne me complique pas la vie moi

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Mais je me demandais s'il n'y avait pas moyen de faire communiquer deux objets sans être obligé de passer une référence de l'un à l'autre ?
    Le problème c'est que ton Thread a une vie, mais ta ClassPrincipale n'en a pas De toutes façons que tu fasse du synchrone ou de l'asynchrone à un moment donnée faut passer par un référence pour transmettre le message du point A au point B Y a toutes sortes d'outils pour ca, les queue ou tu stocke les message et un autre thread les lits, le système du style aux listeners, où tout se fait de manière synchrone dans un Thread. Si tu travaille avec l'API swing, tu peux aussi injecter tes propre events dans la pile de l'EDT.

    Par exemple, le thread déclencherait un événement qui serait traité dans ma classe principale. J'ai pensé aux AbstractAction.
    Les abstractAction n'ont pas de vie propre, pas plus que les listener, tu ne fait jamais que relier cette classe à un Composant graphique et c'est le composant graphique qui appellera des méthodes dessus, mais encore une fois, le composant a dont un référence vers l'Action

    Je me demande si je ne me complique pas la vie moi
    Me semble oui

  6. #6
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Bon, je vais faire au plus simple : je vais transmettre à mon thread une référence de ma classe principale

    à vous

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

Discussions similaires

  1. Réponses: 31
    Dernier message: 01/10/2009, 14h21
  2. Envoyer un message a toutes instances d'une class
    Par toure32 dans le forum Delphi
    Réponses: 2
    Dernier message: 18/11/2006, 20h06
  3. [ServerSocket] Envoyer un message vers un client
    Par Michel_57 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 06/08/2004, 23h01
  4. Réponses: 6
    Dernier message: 03/03/2004, 14h31
  5. Envoyer un message icmp (Echo Request)
    Par ovdz dans le forum Développement
    Réponses: 5
    Dernier message: 19/06/2003, 14h14

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