Thread probleme d'acces a des controles

Résolu
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 8 mars 2006 à 13:20
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009 - 8 mars 2006 à 14:11
Yop
j'ai un probleme
j'ai une fonction quia une boucle qui dure treeeeeeeeeeeeees longtemps (quelques milliers d'entree a verifier une par une et c'est assez long (5% en 10 minutes))

j'ai donc voulu faire un thread puor eviter que le programme ne soit bloqué (que l'utilisateur puisse deplacer la fenetre, la reduire etc sans que le programme ne se bloque)

c'est la premiere fois que je creait un thread
donc je regarde dans la msdn comment creer un thread

private void bcomparer_Click(object sender, EventArgs e)
{
Date1 = combo_dates.SelectedItem.ToString();
Date2 = combo_dates2.SelectedItem.ToString();
Thread T = new Thread(new ThreadStart(analyse));
T.Start();

}

private void analyse()
{
blablablabl
}


je lance le programme et tout marche bien apparement
mais des qu'il lance le thread et fait appel a la fonction analyse une erreur me dit que je ne peux pas accede a un controle qui a ete cree dans un thread different

j'ai en effet plusieurs controle (checkbox, combobox) auquels je dois acceder en lecture, et je dois ecrire dans un richtext

j'ai cherché un peu sur le site et j'ai vu une reponse de coq parlant de delegate. mais j'ai absolument rien compris
donc est ce que quelqu'un pourrait m'expliquer ce qu'est un delegate, a quoi il sert, comment l'utiliser pour acceder a n'importe quel controle de ma form?

5 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
8 mars 2006 à 13:32
Vive le Cross-threading . Ca revient souvent en ce moment ;)

Tu ne peux en effet pas modifier un Control qu'un Thread a créé depuis un autre Thread. Donc il faut utiliser les délégations . Je te redirige vers ce tuto et le lien msdn qui y est en référence.

Pour ce qui est de l'acces en lecture, ca ne doit pas poser de probleme par contre


Mx
MVP C#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
8 mars 2006 à 14:10
En faisant ca, tu lances la méthode analyse dans le contexte du Tread de ta Form, donc c'est comme si tu n'utilisais pas le Thread.

Lance ta méthode analyse dans ton Thread, et appele des Invoke (ou BeginInvoke si tu veux) pour modifier ce qui se situe dans ton IHM (faire augmenter ton progressbar par exemple).
C'est aussi plus propre d'appeler EndInvoke pour chaque BeginInvoke utilisé.



Mx
MVP C#
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 mars 2006 à 13:34
Salut , tu comprendras tout avec le tutorial de Mx :

http://www.csharpfr.com/tutorial.aspx?ID=174

Sinon le plus simple suffit de rajouter dans ta boucle :

Application.DoEvent( ); // pas besoin de thread.
0
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
8 mars 2006 à 14:01
ok j'ai essayé :)
seulement ça resoud pas mon probleme
donc j'ai du mal comprendre l'interet des thread

quand je lance ma fonction, je ne peux touours pas deplacer la fenetre au risque de voir l'affichage se bloquer (normalement une progressbar augmente mais la elle devient toute blanche (comme le reste de l'affichage)

la seule maniere de debloquer est de mettre un this.refresh() a chaque tour de boucle mais ça ralentit fortement mon programme...

pourquoi l'affichage reste t il bloqué malgré le thread?
comment y remedier? (a par application.doevent()

voila mon code maintenant

private void bcomparer_Click(object sender, EventArgs e)
{
Date1 = combo_dates.SelectedItem.ToString();
Date2 = combo_dates2.SelectedItem.ToString();
if (Date1 != "" & Date2 != "")
{
Thread t = new Thread(new ThreadStart(threadmethod));
t.Start();
}

}

private void threadmethod()
{
BeginInvoke(new delanalyse(analyse), null);
}




private delegate void delanalyse();
private void analyse()
{
les differentes boubles...
}
0

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

Posez votre question
warenbe Messages postés 145 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 septembre 2009
8 mars 2006 à 14:11
ok merci pour ton aide :)
0
Rejoignez-nous