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

C# Discussion :

Communications inter threads


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut Communications inter threads
    Mon grand soucis, les threads je découvre un peu sur le tas et j'ai un peu de mal je vous avoue je vous expose le soucis :

    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
     
    public partial class Reglages : UserControl
        {
            private int tailleDispo;
            private bool depassement;
            private Fenetre fenetre;
     
            public Reglages(Fenetre a)
            {
                InitializeComponent();
                fenetre = a;
                tailleDispo = fenetre.getLayout().Height;
                depassement = false;
            }
     
            private void bouton_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(lanceProprietes));
            }
     
            private void lanceProprietes(object sender)
            {
                Application.EnableVisualStyles();
                Application.Run(new Proprietes(this));
            }
     
            public void setProprietes(string[] monde, bool mondeCheck)
            {
                if (mondeCheck)
                {
                    if (tailleDispo - 150 > 0 && depassement == false)
                    {
                        fenetre.getLayout().Controls.Add(new RSSAffichage(monde[0], monde[1], monde[2]));
                        tailleDispo = tailleDispo - 150;
                    }
                    else
                        depassement = true;     
                }
            }
        }
    Donc cette classe un thread qui en fait lance un nouveau form.

    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
     
    public partial class Proprietes : Form
        {
     
            private String[] monde;
            private bool mondeCheck;
            private Reglages reglages;
     
            public Proprietes(Reglages a)
            {
                InitializeComponent();
                reglages = a;
                monde = new String[3];
            }
     
            private void checkMonde_CheckedChanged(object sender, EventArgs e)
            {
                if (checkMonde.Checked)
                {
                    monde[0] = "http://www.lemonde.fr/rss/une.xml";
                    monde[1] = "lemonde";
                    monde[2] = "http://www.lemonde.fr/";
                    mondeCheck = true;
                }
                else
                {
                    monde[0] = "";
                    monde[1] = "";
                    monde[2] = "";
                    mondeCheck = false;
                }
            }
     
            private void boutonOk_Click(object sender, EventArgs e)
            {
                diffuseProprietes();
            }
     
            private void diffuseProprietes()
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new Action(diffuseProprietes));
                }
                else
                {
                    reglages.setProprietes(monde, mondeCheck);
                }
            }
        }
    Le soucis se présente au niveau de la communication entre proprietes et reglages je pensai que la méthode Invoke() me permettait de faire appel au thread père.

    Je suis un peu perdu dans les méthodes comment établir la communication entre mon form contenu dans un thread et une méthode de la classe reglages contenu dans le thread père en lui fournissant des paramètres contenu dans mon form.

    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Le soucis se présente au niveau de la communication entre proprietes et reglages je pensai que la méthode Invoke() me permettait de faire appel au thread père.
    Quand tu fais un Control.Invoke( ), la fonction que tu passes dans le Invoke() est exécute par le thread l'interface et te permet de mettre à jour ton IHM.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Donc en gros la méthode que je donne dans le invoke ne dois pas faire partie du thread fils mais du thread père ?

    Peut t'on passé des paramètres par un invoke ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Donc en gros la méthode que je donne dans le invoke ne dois pas faire partie du thread fils mais du thread père ?
    Une méthode ne fait pas partie d'un thread mais d'une classe. Une méthode peut être exécutée à partir de n'importe quel thread, sauf si elle met à jour des contrôles de l'IHM, dans ce cas elle doit être exécutée par le thread le l'IHM.


    Peut t'on passé des paramètres par un invoke ?
    http://msdn.microsoft.com/fr-fr/libr...kb(VS.80).aspx

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    http://www.hiboox.fr/go/images/diver...ec05c.jpg.html

    Donc voilà ce que donne mon application.
    A droite ma sidebar avec son bouton réglages.
    Donc dans le thread principal classe Reglages lance un nouveau thread pour l'affichage du form de propriétés. Une fois les choix effectués je checke les box et selon les choix je dois insérer des user control dans mon form principal. Voilà pour le fonctionnement de mon application.

    Donc le soucis c'est que les résultats sont dans le thread du Proprietes. Je dois communiquer des variables au thread principal pour qu'il sache lui quels user control inséré. Voilà le code :

    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
    public partial class Reglages : UserControl
        {
            private int tailleDispo;
            private bool depassement;
            private Fenetre fenetre;
            public delegate void delegue(string[] monde, bool mondeCheck);
            public delegue mydelegue;
    
            public Reglages(Fenetre a)
            {
                InitializeComponent();
                fenetre = a;
                tailleDispo = fenetre.getLayout().Height;
                depassement = false;
                mydelegue = new delegue(setProprietes);
            }
    
            private void bouton_Click(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(lanceProprietes));
            }
    
            private void lanceProprietes(object sender)
            {
                Application.EnableVisualStyles();
                Application.Run(new Proprietes(this));
            }
    
            public void setProprietes(string[] monde, bool mondeCheck)
            {
                if (mondeCheck)
                {
                    if (tailleDispo - 150 > 0 && depassement == false)
                    {
                        fenetre.getLayout().Controls.Add(new RSSAffichage(monde[0], monde[1], monde[2]));
                        tailleDispo = tailleDispo - 150;
                    }
                    else
                        depassement = true;     
                }
            }
        }
    Je limite le code a lemonde ce sera suffisant

    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
     
    public partial class Proprietes : Form
        {
     
            private String[] monde;
            private bool mondeCheck;
            private Reglages reglages;
     
            public Proprietes(Reglages a)
            {
                InitializeComponent();
                reglages = a;
                monde = new String[3];
            }
     
            private void checkMonde_CheckedChanged(object sender, EventArgs e)
            {
                if (checkMonde.Checked)
                {
                    monde[0] = "http://www.lemonde.fr/rss/une.xml";
                    monde[1] = "lemonde";
                    monde[2] = "http://www.lemonde.fr/";
                    mondeCheck = true;
                }
                else
                {
                    monde[0] = "";
                    monde[1] = "";
                    monde[2] = "";
                    mondeCheck = false;
                }
            }
     
            private void boutonAnnuler_Click(object sender, EventArgs e)
            {
                this.Close();
            }
     
            private void boutonOk_Click(object sender, EventArgs e)
            {
                diffuseProprietes();
            }
     
            private void diffuseProprietes()
            {
                if (this.InvokeRequired)
                {
                    reglages.Invoke(reglages.mydelegue, monde, mondeCheck);
                    this.Close();
                }
                else
                {
                    reglages.setProprietes(monde, mondeCheck);
                    this.Close();
                }
            }
        }
    Je pensais qu'en mettant un délégué sur ma fonction et en l'invoquant dans le thread de proprietes les variables allait etre transmises mais j'ai toujours un probleme de communication inter-threads qui m'est indiqué au niveau de la ligne en rouge. Désolé d'être persistant ou de paraitre long à la détente mais j'ai du mal à arriver au bout.

    Merci d'avance

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Pourquoi tu affiches Proprietes à partir d'un thread différent.
    fait un essai en appelant directement Proprietes.Show();
    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
     
    public partial class Reglages : UserControl
        {
            private int tailleDispo;
            private bool depassement;
            private Fenetre fenetre;
            public delegate void delegue(string[] monde, bool mondeCheck);
            public delegue mydelegue;
    		Proprietes propriete;
     
            public Reglages(Fenetre a)
            {
                InitializeComponent();
                fenetre = a;
                tailleDispo = fenetre.getLayout().Height;
                depassement = false;
                mydelegue = new delegue(setProprietes);
    			propriete = new Proprietes(this);
            }
     
            private void bouton_Click(object sender, EventArgs e)
            {
    			propriete.Show();
            }
     
     
            public void setProprietes(string[] monde, bool mondeCheck)
            {
                if (mondeCheck)
                {
                    if (tailleDispo - 150 > 0 && depassement == false)
                    {
                        fenetre.getLayout().Controls.Add(new RSSAffichage(monde[0], monde[1], monde[2]));
                        tailleDispo = tailleDispo - 150;
                    }
                    else
                        depassement = true;     
                }
            }
        }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Merci beaucoup matdur. J'ai été pris par la fièvre créatrice de thread.
    Je ne connaissai pas cette méthode.

Discussions similaires

  1. Communication inter-threads par stdout sous linux
    Par millerf dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 17/07/2007, 11h28
  2. Réponses: 4
    Dernier message: 15/06/2007, 10h41
  3. Communication inter-threads: methode elegante?
    Par jc_isd dans le forum C++
    Réponses: 10
    Dernier message: 17/01/2007, 10h55
  4. [c#]Communication inter thread
    Par chasse dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/12/2006, 20h45
  5. communication inter-thread en c sous linux
    Par splinternabs dans le forum POSIX
    Réponses: 17
    Dernier message: 22/02/2006, 09h34

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