Bonjour,
Tout d'abord je voudrai remercier la communauté de developpez.net où j'ai pu trouver des solutions à la plupart de mes problèmes rien qu'en parcourant les forums, les FAQ et les tutoriaux depuis plus d'un an maintenant.
Je réalise en ce moment un projet sous visual studio C++ 2008 basé sur une windows form sensée afficher des données reçues via un périphérique externe (type port série) dans une textBox. Il y a donc un thread (n°1) consacré aux contrôles de la windows Form et un autre thread (n°2) qui gère les communications avec le périphérique.
Lorsqu'une trame est reçue par le thread n°2 je ne peux pas directement l'écrire dans la textBox de mon interface. J'ai donc mis en place un delegate pour pouvoir accéder aux routines de l'interface graphique. Il est déclaré dans un .h commun à tout le projet :
delegate void Ecrire(void);
Le code à exécuter pour écrire dans la textbox est décrit dans la classe de la windows form(Projet::Form1). Pour l'instant je veux juste afficher OK à chaque réception d'une trame:
1 2 3 4
| public: void EcrireTextBox(void)
{
textBox1->AppendText("OK");
} |
Enfin, dans le fichier .cpp contenant les fonctions bas de niveau de communication avec le port série je fais appel au délégué pour accéder à EcrireTextBox :
1 2 3
| Projet::Form1 ^ pnt = gcnew Projet::Form1;
Ecrire ^ delegue = gcnew Ecrire(pnt, &Projet::Form1::EcrireTextBox);
delegue->Invoke(); |
Quand je met tout ça en debug je vois que lorsqu'une trame est reçue je rentre bien dans la fonction "EcrireTextBox" et son code est exécuté. Par contre rien ne s'affiche dans la TextBox. En observant les outils de debug j'ai vu que le programme restait toujours dans le thread n°2 ce qui, pour moi, explique qu'il n'y a aucun effet sur la textBox (gérée par le thread n°1).
Comment puis-je redonner la main à l'interface graphique (thread n°1) juste le temps de modifier la textbox?
Merci d'avance
Partager