Threading pour accéder aux Items d'une ListView [Résolu]

Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Dernière intervention
27 juin 2007
- - Dernière réponse : Julien237
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
3 mars 2009
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Julien237
Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Dernière intervention
27 juin 2007
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_tahiti_bob
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Salut,
Je te conseille vivement de jeter un oeil sur ce tuto

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
86
Date d'inscription
jeudi 8 juillet 2004
Dernière intervention
27 juin 2007
0
Merci
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
Commenter la réponse de cs_tahiti_bob
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
3 ans de dev?
Ca doit etre mieux que Media Player 11 alors...

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Dernière intervention
7 septembre 2009
0
Merci
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
Commenter la réponse de cs_Yxion
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
3 mars 2009
0
Merci
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.
Commenter la réponse de Julien237

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.