Threading pour accéder aux Items d'une ListView

[Résolu]
Signaler
Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Statut
Membre
Dernière intervention
27 juin 2007
-
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
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

Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Statut
Membre
Dernière intervention
27 juin 2007
1
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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,
Je te conseille vivement de jeter un oeil sur ce tuto

<hr />
-Blog-
Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Statut
Membre
Dernière intervention
27 juin 2007
1
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
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
3 ans de dev?
Ca doit etre mieux que Media Player 11 alors...

<hr />
-Blog-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.