Threading pour accéder aux Items d'une ListView

Résolu
cs_tahiti_bob Messages postés 86 Date d'inscription jeudi 8 juillet 2004 Statut Membre Dernière intervention 27 juin 2007 - 26 juin 2007 à 13:50
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 27 juin 2007 à 14:17
Bonjour,

Au chargement d'une form, je remplis un contrôle ListView (name: liste) à partir des rows d'un DataGridView.
Je voudrais, dans un thread séparé, traiter chaque Items de la ListView. J'ai justement une exception "Opération inter-threads non valide : le contrôle 'liste' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.".

Existe t'il une solution pour récupérer les Items de ma ListView afin que dans mon thread je puisse les parcourir simplement avec un foreach ?

Merci d'avance de vos réponses
@++ Clém

7 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
26 juin 2007 à 14:47
Salut,
Une mauvaise solution (pourquoi je te la présente si elle est mauvaise :p, juste pour tester ton appli, elle n'est pas valable à long terme) est simplement de faire
Controls.CheckForIllegalCrossThreadCall = false;
(nom de la propriété de mémoire, peut-être vaguement différente...)

Pour une solution plus sérieuse, tu dois utiliser Invoke. Donc toutes les lignes de codes qui touchent au propriétés et aux méthodes de ta listview doivent être placé dans une méthode, puis dans ton thread fille, tu fais ListView.Invoke(delegatedetaméthode).

Julien.
3
cs_tahiti_bob Messages postés 86 Date d'inscription jeudi 8 juillet 2004 Statut Membre Dernière intervention 27 juin 2007 1
27 juin 2007 à 14:06
Bonjour,

Merci Yxion pour ton code sur le threading.
J'ai finalement utilisé ce que Julien237 a proposé avec le Control.Invoke(delegate).

//Déclaration
private
delegate
void
tag_Delegate();

private
tag_Delegate deleg_tag;

private
Thread tagger;

Au chargement de la form

deleg_tag =
new
tag_Delegate(
this.ajout);
tagger =
new
Thread(
new
ThreadStart(
this.ThreadPro));
tagger.Start();

private
void ThreadPro()
{
liste.Invoke(deleg_tag); //Où "liste" est le nom du contrôle ListView
}

private

void ajout()
{

      foreach (
ListViewItem lvi
in liste.Items)
      {

      //Code...
      }
}

@++ Clém
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 juin 2007 à 14:52
Salut,
Je te conseille vivement de jeter un oeil sur ce tuto

<hr />
-Blog-
0
cs_tahiti_bob Messages postés 86 Date d'inscription jeudi 8 juillet 2004 Statut Membre Dernière intervention 27 juin 2007 1
26 juin 2007 à 16:00
Bonjour,

Merci Julien237 de ta réponse. Il est effectivement possible de désactiver la levée d'exceptions pour l'interthread j'avais vu ca il me semble dans les propriétés de mon projet^^. J'avais essayé de passer par les Invoke sans succès je vais tenter ce que tu me propose.
Bidou, merci pour le tuto je vais y jeter un coup d'oeil :D

Merci à vous deux. Je vous tiens au courant de l'évolution de mon problème!
Mon projet approche de sa version finale (Bibliothèque et lecteur multimédia après presque 3 ans de développement :D).

@++ Tahiti_bob
0

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

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 juin 2007 à 18:04
3 ans de dev?
Ca doit etre mieux que Media Player 11 alors...

<hr />
-Blog-
0
cs_Yxion Messages postés 219 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 septembre 2009
26 juin 2007 à 22:52
J'ai laissé une source pour utiliser les "Invoke" des forms : C'est simple et ca doit correspondre parfaitement à ton utilisation : Tu créer une classe pour ton thread, tu lui pose un champ pour cibler le formulaire avec lequel agir, et tu lui envoi les infos sous forme d'un évenement que tu gère dans ta form
http://www.csharpfr.com/codes/THREADER-SIMPLEMENT-CLASSE-POUR-INTERAGIR-AVEC-FORM_42292.aspx
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
27 juin 2007 à 14:17
M'enfin mon message ! Il a disparu ^^...
Bon je retappe...

Lorsque tu utilise Controle.Invoke(MaMéthode) c'est le thread créateur du controle qui s'exécute sur MaMéthode, donc ici tu ne fais pas de multi-threading (ou en tout cas rien d'utile).
Tu devrais plutot mettre ton algo qui prend du temps (puisque j'imagine que c'est la raison pour laquelle tu fais du multi-threading) dans ThreadPro, et mettre l'affichage final qui touche au controle dans ajout... Je pense qu'ajout ne devrait pas faire plus d'une ou deux lignes de codes...

<hr width="100%" size="2" />Julien.
0
Rejoignez-nous