cs_tahiti_bob
Messages postés86Date d'inscriptionjeudi 8 juillet 2004StatutMembreDernière intervention27 juin 2007
-
26 juin 2007 à 13:50
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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 ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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).
cs_tahiti_bob
Messages postés86Date d'inscriptionjeudi 8 juillet 2004StatutMembreDernière intervention27 juin 20071 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Yxion
Messages postés219Date d'inscriptionjeudi 6 juillet 2006StatutMembreDerniè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
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...