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

cs_tahiti_bob 86 Messages postés jeudi 8 juillet 2004Date d'inscription 27 juin 2007 Dernière intervention - 26 juin 2007 à 13:50 - Dernière réponse : Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention
- 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
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 26 juin 2007 à 14:47
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.

Merci Julien237 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

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

Merci cs_tahiti_bob 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

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

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

<hr />
-Blog-
Commenter la réponse de cs_Bidou
cs_Yxion 219 Messages postés jeudi 6 juillet 2006Date d'inscription 7 septembre 2009 Dernière intervention - 26 juin 2007 à 22:52
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
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 27 juin 2007 à 14:17
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.