Thread probleme d'acces a des controles [Résolu]

Signaler
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009
-
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009
-
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

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
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#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
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#
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
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.
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

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...
}
Messages postés
145
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 septembre 2009

ok merci pour ton aide :)