Résolu TextBox Threads

Statut
N'est pas ouverte pour d'autres réponses.

Wims

Premium
Inscription
27 Août 2014
Messages
1 805
Réactions
418
Points
15 911
Bonsoir,

J'ai un petit problème concernant un programme que je développe en C#.

En effet, je suis en train de créer une boucle infini qui pour autant ne fait pas freeze le logiciel (mais qu'on pourra arrêter à l'aide d'un bouton).

J'ai donc fait appel à l'utilisation d'un thread qui executera la boucle sans que l'application freeze.

Ci-dessous, la partie du code avec la création du thread, ainsi que la boucle :

Code:
private void button2_Click_1(object sender, EventArgs e)
        {
            textBox1.Text = String.Empty;
            Thread newThread = new Thread(Data);
            newThread.Start();
        }

        private void Data()
        {
            while (true)
            {
                string data_rx = port.ReadLine();
                textBox1.AppendText(Environment.NewLine);
                textBox1.AppendText(data_rx);
            }
        }


Jusqu'à la tout va bien.
Or au moment de lancer l'application, et d'appuyer sur le bouton pour executer la boucle j'ai cette erreur :

"Opération inter-threads non valide : le contrôle 'textBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

devenv_2017-05-08_01-13-57.png


Je comprend bien l'erreur, mais je n'ai aucune idée de comment la résoudre.

J'ai fais pas mal de recherches sur internet, mais je ne trouve rien.. :/

Merci d'avance à ceux qui m'aiderons !
 
Dernière édition:

Wims

Premium
Inscription
27 Août 2014
Messages
1 805
Réactions
418
Points
15 911
J'ai finalement réussi à résoudre mon problème.

Pour ceux qui veulent la solution la voici :

On va tout simplement utiliser cette ligne de code :

Code:
textBox1.Invoke(new Action(() =>
                {
                    //Ton code original
                }));

Donc pour moi ça donne :

Code:
private void Data()
        {
            while (true)
            {
                string data_rx = port.ReadLine();
                textBox1.Invoke(new Action(() =>
                {
                    textBox1.AppendText(Environment.NewLine);
                    textBox1.AppendText(data_rx);
                }));
          }
   }

Suivi de ma condition if que j'ai rajouté par la suite pour arrêter la boucle quand je clique sur le button3 :

Code:
if (button3WasClicked)
                {
                    break;
                }
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut