IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB2008] Threads et ListView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut [VB2008] Threads et ListView
    Bonjour,

    Voici le contexte:
    J'ai un Thread principal qui est ma Form dans laquel est créée une ListView.
    En cliquant sur un bouton, j'exécute un Thread (pas un BackGroundWorker je précise) qui doit lire certaines données de la ListView

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For Each ItemChecked In ListView.CheckedItems
                    FileName = ItemChecked.ToString
                Next
    Mais c'est pas franchement Thread Safe. J'ai donc réalisé les Function suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Function GetListViewChecked(ByRef MyControl As ListView)
            Return MyControl.CheckedItems
        End Function
     
        Delegate Function GetSafeListViewChecked(ByRef MyControl As ListView)
    Et j'ai modifié mon code en conséquence:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For Each ItemChecked In Invoke(New GetSafeListViewChecked(AddressOf GetListViewChecked), ListView) 
                    FileName = ItemChecked.ToString
                Next
    Mais j'ai toujours l'erreur d'invocation multi-thread sur la lecture de ma ListView.

    Quelqu'un aurait-il une idée? merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En fait, je pense que la collection CheckedItems que tu récupères est encore liée au ListView, donc quand tu y accèdes ça revient à accéder à l'interface graphique. Il faudrait que ta méthode GetListViewChecked renvoie une liste des éléments cochés indépendante de la ListView

    D'autre part, évite de déclarer des fonctions sans préciser le type de retour, sinon tu risques d'avoir de mauvaises surprises...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Function GetListViewChecked(ByRef MyControl As ListView) As List(Of ListViewItem)
            Dim lst as New List(Of ListViewItem)
            lst.AddRange(MyControl.CheckedItems)
            Return lst
        End Function
     
        Delegate Function GetSafeListViewChecked(ByRef MyControl As ListView) As List(Of ListViewItem)
     
    ...
     
                For Each ItemChecked In Invoke(New GetSafeListViewChecked(AddressOf GetListViewChecked), ListView) 
                    FileName = ItemChecked.ToString
                Next

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    Si j'ai bien compris, au lieu de renvoyer les valeurs Checked de la ListView qui sont toujours rattachées au Thread Principal, le but est de créer une List Mémoire qui contient les valeurs de la ListView pour travailler directement avec celle-ci.

    Par contre, je recontre un autre type de problème en essayant de récupérer les ItemChecked de la nouvelle List renvoyée par la fonction:

    Impossible d'effectuer un cast d'un objet de type 'CheckedListViewItemCollection' en type 'System.Collections.Generic.IEnumerable`1[System.Windows.Forms.ListViewItem]'.

    Par contre, merci pour ton conseil pour le typage des valeurs de retour. Etant débutant en VB et venant de Windev, c'est pas encore un automatisme.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah ok, au temps pour moi... ListView.CheckedListViewItemCollection n'implémente pas IList(Of ListViewItem) comme je l'avais supposé. Tu n'as qu'à remplacer List(Of ListViewItem) par ArrayList, ça devrait le faire...

  5. #5
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    Ok merci, ça passe effectivement mieux mais je ne peux pas te blâmer pour ton erreur, sans toi, je n'aurais pas avancé. Et l'erreur est humaine hein ?!

  6. #6
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ah ok, au temps pour moi... ListView.CheckedListViewItemCollection n'implémente pas IList(Of ListViewItem) comme je l'avais supposé. Tu n'as qu'à remplacer List(Of ListViewItem) par ArrayList, ça devrait le faire...
    En fait, pour qu'une collection puisse être énumérée il faut juste que la méthode GetEnumerator<T>() ou GetEnumerator() soit implémentée dans la classe (pas besoin d'implémenter l'interface IEnumerable ou IEnumerable<T>.

    D'après un article écrit par Microsoft, il suffirait d'une méthode Add et de la présence d'un énumérateur pour prétendre qu'une classe est une collection

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par harz62 Voir le message
    En fait, pour qu'une collection puisse être énumérée il faut juste que la méthode GetEnumerator<T>() ou GetEnumerator() soit implémentée dans la classe (pas besoin d'implémenter l'interface IEnumerable ou IEnumerable<T>.
    En fait ma remarque était par rapport au type d'argument accepté par la méthode AddRange (d'ailleurs c'est IEnumerable<T> et non IList<T>), pas par rapport à l'énumération avec foreach...

    Citation Envoyé par harz62 Voir le message
    D'après un article écrit par Microsoft, il suffirait d'une méthode Add et de la présence d'un énumérateur pour prétendre qu'une classe est une collection
    Je ne pense pas que la méthode Add soit requise, vu que certaines collections sont en lecture seule... à mon avis l'énumerateur suffit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ListView customisation thread
    Par fares.gl dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 12/10/2011, 13h50
  2. Réponses: 8
    Dernier message: 11/03/2009, 17h38
  3. [VB2008] Taille d'image dans un ListView
    Par Tagazog dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/11/2008, 15h54
  4. Thread et listView C++ cli
    Par abbd dans le forum C++/CLI
    Réponses: 9
    Dernier message: 01/08/2007, 13h40
  5. Threads et données d'un listview.
    Par azerty53 dans le forum VB.NET
    Réponses: 10
    Dernier message: 06/06/2007, 20h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo