[C# 2.0] Problemes de thread

Résolu
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 10 avril 2005 à 16:25
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 10 avril 2005 à 18:03
Bonjour a tous.



Je suis en train de faire une classe qui fourni une connexion a une
base de données pour mon application, et qui lui permet aussi de lui
indiquer les evenements de la connexion. (quand on s'est bien connecté,
quand on arrive pas a se connecter, ...)

Elle a donc les méthodes Connect, Disconnect, et les events DBConnected et DBDisconnected

J'ai déclaré un singleton pour que toutes les classes de mon
application qui en ont besoin utilise la meme instance de cette classe
qui fournit la connexion.



Mon application tente de se connecter via ce singleton dès qu'elle est
lancée. Je l'inscris aux evenements DBConnected / DBDisconnected cités
ci-dessus.

Dans les méthodes de ces évènements, je change le texte de ma barre de
statut pour y indiquer un message correspondant a l'état de la
connexion.



Pour ne pas que l'application soit bloquée pendant le temps de
connexion (surtout si il y a un timeout), j'appele la méthode Connect()
dans un nouveau Thread.



Cependant, voila. Visual C# Express me lève une erreur, d'apres lui il
y a un "Illegal cross-thread operation" lors du changement de texte
dans la barre de statut.

Bien sur, quand je n'utilise plus le Thread, aucun probleme... Mais bon, c'est moins rigolo...

Et quand je lance l'appli en dehors de visual studio, aucune erreur n'est levée.



Pourtant j'imagine que si Visual Studio s'alarme, c'est qu'il y a une raison, donc j'ai bien du faire une erreur...



J'ai cherché toute l'aprem, mais j'arrive pas a trouver la raison... Je
sais tres bien qu'il ne faut pas acceder aux ressources s'un autre
thread, mais la je ne vois pas bien ou ce situe cette opération.



Quelqu'un pourrait me donner des indices, ou m'indiquer la bonne marche a suivre ?



Merci.


Mx

5 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 avril 2005 à 16:55
Salut,

Un controle ne doit pas être modifié par un autre thread que celui qui l'a crée, il faut que tu passes par un delegate qui te permettra de changer ton texte dans le contexete du thread ayant crée le controle en utilisant la méthode Invoke du controle.

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
10 avril 2005 à 18:01
En effet, le probleme est résolu ainsi :



private delegate void UpdateControl(string str);



private void UpdateText(string str)


{


StatusLabel.Text = str;


}



void DBDisconnected()

{

BeginInvoke(new UpdateControl(UpdateText), new object[] { "pas ok" });

}



void cp_DBConnected()

{

BeginInvoke(new UpdateControl(UpdateText), new object[] { "ok" });

}




Merci encore pour l'indication :)
Mx
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 avril 2005 à 16:57
On a déjà parler de ça plusieurs fois ces derniers temps mais je n'arrive pas à remettre la main sur les sujets :-(

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
10 avril 2005 à 16:59
Ah oui, oki, je vois.

Je vais tenter de retrouver le sujet.



(J'avais pourtant l'impression que, en m'inscrivant aux evenements
depuis ma Form, c'etait elle qui modifiait le texte de ses Controls,
pas un l'autre Thread. C'est pour ca que je comprenais pas...)



Merci coq.

Mx
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 avril 2005 à 18:03
de rien :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Rejoignez-nous