Problème avec Event, Form et Thread

Signaler
Messages postés
3
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
27 mars 2007
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
-
    Bonjour à tous,


Voilà mon problème :


J'ai une classe principale qui gère mon appli. Cette dernière fait interface entre un programme existant (via des API) et notre central téléphonique via TAPI.


Ensuite une classe de gestion TAPI et une autre classe d'évènements TAPI.


Enfin, une troisième classe gère un petit Form qui affiche les informations obtenues depuis les évènements TAPI.


Pour le moment, j'ai simplement fait un delegate dans ma classe d'event TAPI qui sont interceptés dans la classe TAPI, suite à quoi je crèe un objet Form que j'affiche ensuite. Tout de suite mon premier problème, ma Form est "gelée" !! Je passe par dessus ce problème en créant la Form dans un Thread. La c'est presque parfait, excepté, que depuis un autre event TAPI, je veux modifier le texte d'un label de ladite Form.
Ce que j'ai fait est que je passe un paramètre dans le constructeur de la classe du Form, ce paramètre étant l'objet Event TAPI. A ce moment la, je vois en debug que je peux bien intercepté l'énvement directement dans la classe de ma Form.
Le problème est que rien ne se passe.. En mode debug, je mets un "STOP-Point rouge", et quand le debugger arrive dessus, je peux continuer le debug avec F5, là, tout Visual Studio se freeze 3-4 secondes mais ensuite, tout fonctionne ??? Si je ne fais pas cette étape, il ne se passe simplement rien du tout et mon label n'est pas modifié.........
Je ne peux pas faire une boucle avec Application.DoEvents sinon je ne peux plus intercepté mon event TAPI..
Je suis non seulement coincé, mais en plus, je deviens complètement fou^^


Merci d'avance pour toutes suggestions !!


Chris.

2 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
tout simplement, il est impossible de modifier un composant graphique dans un autre thread que celui qui l'a créé. je m'explique. tu as thread1 qui est le thread principal, et thread2 qui crée la form. thread1 ne peux modifier aucun composants graphique de la form, seul thread2 a le droit.
de plus, lorsque tu lève un évènement, c'est le thread qui a levé l'évènement qui éxecute le code d'interception de l'évènement. Donc si thread2 capte un évènement de thread1, et que le code executé au moment de l'interception modifie un controle de la form, ca plante...

la solution est pas compliqué :

delegate void MaMethodeCallback(int a, string b)

void MaMéthodeQuiModifieLaFormDansUnAutreThreadDansLaClasseForm(int a, string b)
{
if (this.InvokeRequired)
{
MaMethodeCallback d = new MaMethodeCallback(MaMéthodeQuiModifieLaFormDansUnAutreThread);
object[] Params = new object[2];
Params[0] = a;
Params[1] = b;
this.Invoke(d, Params);
}
else
{
//Code qui modifie la form
}
}

ici, ta méthode est "ThreadSafe", cest a dire que si un autre thread tente de l'executer, elle "invoke" une méthode dans le thread qui va bien (ici elle meme).

je ne sais pas si cest tres tres clair, si ya un soucis hesite pas a demander, jessaierais de formuler mieux que ca
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Pour comprendre ce qu'est exactement le cross-threading, je te propose de lire ce tuto

<hr size="2" />VC# forever