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 :

Ecrire dans un RichTextBox depuis un thread


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 862
    Points : 4 832
    Points
    4 832
    Par défaut Ecrire dans un RichTextBox depuis un thread
    Bonjour

    Voilà mon problème, suite à la lecture de la FAQ (http://faqcsharp.developpez.com/?pag...sc#form_thread), je remarque qu'il est possible d'écrire dans un RichTextBox depuis un thread lancé. Or, j'ai essayé d'implémenter cela et malgré tout, rien ne s'écrit.
    Voici le code concerné de ma classe servant de 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public class DirWatcher
        {
            private Log log;
            private String message = "";
            private RichTextBox richTextBox;
     
    public void ProcessCreatedFile()
            {
                while (true)
                {
    //On fait quelque chose d'utile et on met à jour la propriété Message
                }
            }
     
            private void WriteLine()
            {
                log.WriteLine(Message);
                if (this.richTextBox != null)
                {
                    if (richTextBox.InvokeRequired)
                    {
                        richTextBox.Invoke(new TextBoxInvokeHandler(FonctionTextBox));
                    }
                    else
                    {
                        FonctionTextBox();
                    }
                }
            }
     
            private delegate void TextBoxInvokeHandler();
     
            private void FonctionTextBox()
            {
                this.richTextBox.AppendText(Message+"\n");
            }
     
            public String Message
            {
                get
                {
                    return this.message;
                }
                set
                {
                    this.message = value;
                }
            }
    Et voilà le snippet de ma form principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void button1_Click(object sender, EventArgs e)
            {
                this.button2.Enabled = true;
                this.button1.Enabled = false;
                threadStart = new ThreadStart(watcher.ProcessCreatedFile);
                thread = new Thread(threadStart);
                log.WriteLine("Starting thread");
                this.richTextBox1.AppendText("Starting thread\n");
                thread.Start();
            }
    Merci d'avance de votre aide.

    @++

  2. #2
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Personnellement ça me paraît normal que rien ne s'écrit vu que tu met à jour la propriété "Message", mais WriteLine n'est jamais appelé.

    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 DirWatcher
        {
            private RichTextBox richTextBox;
     
    public void ProcessCreatedFile()
            {
                while (true)
                {
    //On fait quelque chose d'utile et appel WriteLine("un message")
                }
            }
     
            private void WriteLine(string msg)
            {
                log.WriteLine(msg);
                if (this.richTextBox != null)
                {
                    if (richTextBox.InvokeRequired)
                    {
                        richTextBox.Invoke(new TextBoxInvokeHandler(FonctionTextBox), object[] {msg}); // Je ne me rappel plus de la syntaxe exacte ici, regarde la MSDN si ça marche pas.
                    }
                    else
                    {
                        FonctionTextBox(msg);
                    }
                }
            }
     
            private delegate void TextBoxInvokeHandler(string msg);
     
            private void FonctionTextBox(string msg)
            {
                this.richTextBox.AppendText(msg+"\n");
            }
    J'ai viré Log et Message de ton code dans la mesure où ils ne servent absolument a rien d'après l'extrait.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 862
    Points : 4 832
    Points
    4 832
    Par défaut
    Salut ctxnop,

    Merci de ta réponse, ça marche. Voici la modification:
    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
     
    private void WriteLine()
            {
                log.WriteLine(Message);
                if (this.richTextBox != null)
                {
                    if (richTextBox.InvokeRequired)
                    {
                        richTextBox.Invoke(new TextBoxInvokeHandler(FonctionTextBox), Message);
                    }
                    else
                    {
                        FonctionTextBox(Message);
                    }
                }
            }
     
            private delegate void TextBoxInvokeHandler(string msg);
     
            private void FonctionTextBox(string msg)
            {
                this.richTextBox.AppendText(msg+"\n");
            }
    Merci encore.

    @++

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Citation Envoyé par GLDavid Voir le message
    Salut ctxnop,

    Merci de ta réponse, ça marche. Voici la modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            private void FonctionTextBox(string msg)
            {
                this.richTextBox.AppendText(msg+"\n");
            }
    Merci encore.

    @++
    De rien.
    Petite remarque de bonnes pratiques au sur ce petit passage.
    Il vaut mieux utiliser string.Format plutôt que de la concaténation à coup d'addition. C'est souvent plus lisible, ça permet la localisation de l'application de façon plus simple et ça gère les conversions de types.
    En prime, il est préférable d'utiliser Environment.NewLine plutôt que "\n". En effet, "\n" sous Windows peut être traduit par "\r\n" quand il passe dans certaines fonctions. En conséquence tu n'est pas assuré de l'intégrité de la chaine. En plus, sur d'autres plateformes ce n'est pas "\r\n" (linux, mac). Comme il s'agit d'une constante définie par la CLR utilisée, elle prend la bonne valeur si tu exécute le code sur un linux+mono par exemple.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/12/2010, 11h32
  2. Ecrire dans une cellule depuis une autre?
    Par noel45 dans le forum Excel
    Réponses: 5
    Dernier message: 10/01/2008, 16h00
  3. ecrire dans fenetre console depuis GUI?
    Par gregcat dans le forum Delphi
    Réponses: 1
    Dernier message: 17/09/2006, 18h07
  4. Réponses: 6
    Dernier message: 30/08/2006, 22h31
  5. [VB.NET] Ecrire dans EXCEL 2002 depuis VB.net
    Par vijeo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/06/2006, 13h09

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