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 :

Thread en C#


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Thread en C#
    Bonjour,
    J’ai trouvé sur le net un tuto c# sur les threads, mais il ne semble pas fonctionner. Il compile, mais au lancement, il y a une erreur qui dit que mon thread essaye de modifier un objet qui n'a pas été créée dans ce thread (c'est pourtant bien ce que je souhaite faire).
    L'url du tuto : http://csharpro.developpez.com/page9.php
    Quelqu'un voit-il un problème dans ce code?
    Dois-je utiliser des délégués?

    Merci beaucoup,

    David.

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Threading;
     
    namespace WindowsApplication1
    {
     
      public partial class Form1 : Form
      {
        private int ti, tj;
     
        public Form1()
        {
          InitializeComponent();
        }
     
     
        private void Form1_Load(object sender, EventArgs e)
        {
          Thread t1, t2;
     
          ti = 0;
          tj = 0;
          t1 = new Thread(new ThreadStart(implemente_ti));
          t1.Start();
     
          t2 = new Thread(new ThreadStart(implemente_tj));
          t2.Start();
        }
     
        private void implemente_ti()
        {
          ti++;
          this.textBox2.AppendText("\r\n" + ti.ToString());
          if (ti <= 10000)
            implemente_ti();
        }
     
        private void implemente_tj()
        {
          tj++;
          textBox3.AppendText("\r\n" + tj.ToString());
          if (tj <= 10000)
            implemente_tj();
        }
      }
    }

  2. #2
    Membre habitué Avatar de Nikoui
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 142
    Points
    142
    Par défaut
    Le problème de ton code, c'est que (comme te l'indique l'exception qui est levée) tu cherches à modifier un contrôle dans une Form, en dehors du thread qui fait tourner la Form (ce qui n'est pas autorisé).

    La solution est donc (comme indiqué dans les détails de l'exception qui est levée) de modifier le code, par exemple de la façon suivante (pour la premiere méthode) :

    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
        // Delegué pour la méthode
        private delegate void implemente_tiDelegate();
    
        private void implemente_ti()
        {
          if(this.textBox2.InvokeRequired)
          {
            // On est pas sur le bon thread
            implemente_tiDelegate d = new implemente_tiDelegate(implemente_ti);
            // on rapelle la méthode depuis le thread courant du contrôle
            this.textBox2.Invoke(d);
          }
          else
          {
            // On est sur le bon thread, on continue
            ti++;
            this.textBox2.AppendText("\r\n" + ti.ToString());
            if (ti <= 10000)
              implemente_ti();
          }
        }
    Working as designed

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    Tout les control lance une exception si on les modifie depuis un autre thread que celui dans lequel ils ont été créés. Pour modifier un control depuis un thread différent il faut utiliser la méthodes Invoke().

    Exemple :

    //Délégué
    private delegate void SetTextDelegate(string text);

    //Modifie le text d'un richTextBox tmpRTB
    private void SetText(string text)
    {
    if(tmpRTB.InvokeRequired)
    {
    SetTextDelegate tmpDelegate = new SetTextDelegate(SetText);
    tmpRTB.Invoke(tmpDelegate, new object[]{text});
    }
    else
    {
    tmpRTB.Text = text;
    }
    }

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Plus élégant :
    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 void implemente_ti()
        {
          if(this.textBox2.InvokeRequired)
          {
            this.Invoke(new MethodInvoker(delegate
            { implemente_ti(); }));
          }
          else
          {
            // On est sur le bon thread, on continue
            ti++;
            this.textBox2.AppendText("\r\n" + ti.ToString());
            if (ti <= 10000)
              implemente_ti();
          }
        }
    Pas besoin de créer un nouveau type de delegate ou autre

  5. #5
    Membre habitué Avatar de Nikoui
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par smyley Voir le message
    Plus élégant :
    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 void implemente_ti()
        {
          if(this.textBox2.InvokeRequired)
          {
            this.Invoke(new MethodInvoker(delegate
            { implemente_ti(); }));
          }
          else
          {
            // On est sur le bon thread, on continue
            ti++;
            this.textBox2.AppendText("\r\n" + ti.ToString());
            if (ti <= 10000)
              implemente_ti();
          }
        }
    Pas besoin de créer un nouveau type de delegate ou autre
    En effet c'est mieux comme ça, je ne connaissais pas cette syntaxe, mais je l'adopte sur le champ
    Working as designed

  6. #6
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    Ou tout simplement oublier les Thread dans ce cas et utiliser un BAckgroundWorker qui est bien plus adequat.

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre aide.
    J'ai bien compris le truc je crois.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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