warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 septembre 2009
-
8 mars 2006 à 13:20
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 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?
A voir également:
Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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é.
warenbe
Messages postés145Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 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();
}