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 :

Threads et données d'un listview.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut Threads et données d'un listview.
    Bonjour, j'ai un soucis avec un de mes threads.

    En fait j'ai un listview qui contient toutes les données que je doit rajouter à la base de données. Vu qu'il s'agit d'une base de données située sur un serveur, le traitement peut etre long sutout si la quantité de lignes a ajouter est importante. J'ai donc crée un thread qui appelle ma procedure. seulement apparement on ne peux pas manipuler des elements de mon listview a l'interrieur de mon thread et je ne sais pas comment faire parce que j'en ai vraiment besoin.

    J'espere que vous avez compris mon probleme et que quelqu'un pourra me donner un coup de main

    Merci beaucoup

    Bonne journée

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tu dois utiliser des delegate. Tu peux trouver enormément de litterature sur google à ce propos.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour,

    c'est un cas classique du multithread.
    Pour accéder à ton listview depuis un autre thread, tu dois utiliser sa méthode Invoke. Voici un lien qui devrait t'aider.

    Comment : faire des appels thread-safe aux contrôles Windows Forms

    Bye

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    je vous remercie, je vais regarder cela de plus pres et je vous tient au courant.

    Il est vrai que je n'avais pas pensé aux delegates.

    bonne journée

  5. #5
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par azerty53
    je vous remercie, je vais regarder cela de plus pres et je vous tient au courant.

    Il est vrai que je n'avais pas pensé aux delegates.

    bonne journée
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Delegate Sub Ajout(ByVal Valeur As String) 'declare un délégué
        Private Sub TraitementBis() 'traitement
            For i As Integer = 0 To 100000 'ajoute 1000 elements dans une listbox
                Invoke(New Ajout(AddressOf Add), New Object() {"Test numéro : " & i.ToString}) 'appel du délégué avec l'argument
                BGW2.ReportProgress(CInt(i / 1000)) 'en pourcentage etat de l'avancement du traitement
            Next
        End Sub
        Private Sub Add(ByVal Valeur As String)
            L_Resultat.Items.Add(Valeur) 'cette fois on ajoute directement l'element
        End Sub
    ++

    PS : fais pas attention aux commentaires c'etait dans le cadre d'un tutos sur les BGW...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    Citation Envoyé par Aspic
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Delegate Sub Ajout(ByVal Valeur As String) 'declare un délégué
        Private Sub TraitementBis() 'traitement
            For i As Integer = 0 To 100000 'ajoute 1000 elements dans une listbox
                Invoke(New Ajout(AddressOf Add), New Object() {"Test numéro : " & i.ToString}) 'appel du délégué avec l'argument
                BGW2.ReportProgress(CInt(i / 1000)) 'en pourcentage etat de l'avancement du traitement
            Next
        End Sub
        Private Sub Add(ByVal Valeur As String)
            L_Resultat.Items.Add(Valeur) 'cette fois on ajoute directement l'element
        End Sub
    ++

    PS : fais pas attention aux commentaires c'etait dans le cadre d'un tutos sur les BGW...
    bonjour,

    Ton traitementbis, il est appelé quand...???

    moi j'ai fait ca, et ca plante et je vois pas trop comment appliquer un delegue dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private iLgChaine As Integer = 0
        Private th As Thread
     
        Private Sub ChangerCouleurTexte()
            Dim r, g, b As Byte
            While True
                If Len(Me.txtSaisie.Text) > 0 Then
                    If Len(Me.txtSaisie.Text) <> iLgChaine Then
                        iLgChaine = Len(Me.txtSaisie.Text)
                        Randomize()
                        r = CType(Int((255 * Rnd()) + 1), Byte)
                        g = CType(Int((255 * Rnd()) + 1), Byte)
                        b = CType(Int((255 * Rnd()) + 1), Byte)
                        Me.txtSaisie.BackColor = System.Drawing.Color.FromArgb(r, g, b)
                        Me.txtSaisie.ForeColor = System.Drawing.Color.FromArgb(255 - r, 255 - g, 255, b)
                    End If
                End If
                Application.DoEvents()
                'Etat du thread
                'Me.txtEtat.Text = th.ThreadState.ToString
            End While
        End Sub
     
     
        Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
            If IsNothing(th) Then
                th = New Thread(AddressOf ChangerCouleurTexte)
                th.Start()
                Me.txtEtat.Text = th.ThreadState.ToString
                th = Nothing
            End If
            Me.txtSaisie.Focus()
        End Sub

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    ok c'est bon j'ai compris.

    j'ai declaré un delegué.

    private Delegate Sub couleur()

    et je l'invoke quand je commence mon thread.

    Invoke(New couleur(AddressOf ChangerCouleurTexte))

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Par défaut
    J'enleve le tag résolu parce que j'ai encore un soucis de thread sur un autre formulaire. et je vois pas du tout, tout le semble bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Private oAdo As ClAdoNet
        Private Delegate Sub transfertDonnees()
        Private Th As Thread
     
    'Cette sub, s'occupe d'effectuer des transferts de données entre bases de données.
    Private Sub Traitement()
            Dim i, j As Integer
            Dim oDataSetBaseApi As DataSet
            Dim oDataRow As DataRow
            Dim strRef As String
            Dim strLib As String
            Dim dblTTC As Double
            Dim blnVis As Boolean
            Dim strCodBar As String
            Dim intConstructeur As String
            Dim intType As String
     
            oAdo = New ClAdoNet
     
            oDataSetBaseApi = oAdo.ChargerDonnees("Select * from article", "article", True)
     
            For i = 1 To ModPanelConsommable.lvListeAttente.Items.Count
                j = 0
                'On parcours la table article
                For Each oDataRow In oDataSetBaseApi.Tables("article").Rows
                    'On compare les codes barre
                    If oDataSetBaseApi.Tables("article").Rows(j).Item("codebarre") = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text Then
                        'Si on trouve le code barre
                        Dim oProduit As ClProduit
                        Try
                            strCodBar = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text
                            strRef = oDataSetBaseApi.Tables("article").Rows(j).Item("code")
                            strLib = oDataSetBaseApi.Tables("article").Rows(j).Item("nom")
                            dblTTC = oDataSetBaseApi.Tables("article").Rows(j).Item("prixbasettc")
                            blnVis = CBool(oDataSetBaseApi.Tables("article").Rows(j).Item("sommeil"))
                            intConstructeur = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(2).Tag
                            intType = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(3).Tag
     
                            oProduit = New ClProduit(strRef, strCodBar, strLib, dblTTC, "", blnVis, intConstructeur, intType)
                            oProduit.Ajouter()
                            oProduit = Nothing
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        End Try
                        'On recharge les differents elements.
                        Exit For
                    End If
                    j += 1
                Next oDataRow
                pgb1.PerformStep()
            Next i
        End Sub
     
    'Bouton qui lance l'opération.
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Création du thread
            If IsNothing(Th) Then
                Th = New Thread(AddressOf Traitement)
                Th.Start()
                Invoke(New transfertDonnees(AddressOf Traitement))
                Th = Nothing
            End If
            MsgBox("Transfert(s) éffectué(s) correctement...", MsgBoxStyle.Information, "Transfert(s) OK.")
        End Sub
    Sur la ligne ou il doit comparer le code barre du dataset et le code barre contenu dans le listview il me sort ca comme exception.
    Opération inter-threads non valide : le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Mon thread me parrait bon, alors est ce que je doit faire le start avant le invoke? d'ou peut venir le probleme ??

    PS: Je suis sous VS2005

    Cordialement.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 94
    Par défaut
    essaye de faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Private Sub Traitement()
            Dim i, j As Integer
            Dim oDataSetBaseApi As DataSet
            Dim oDataRow As DataRow
            Dim strRef As String
            Dim strLib As String
            Dim dblTTC As Double
            Dim blnVis As Boolean
            Dim strCodBar As String
            Dim intConstructeur As String
            Dim intType As String
     
            oAdo = New ClAdoNet
     
            oDataSetBaseApi = oAdo.ChargerDonnees("Select * from article", "article", True)
       If Me.InvokeRequired Then
                Me.Invoke(New MethodInvoker(AddressOf Traitement))
            Else
            For i = 1 To ModPanelConsommable.lvListeAttente.Items.Count
                j = 0
                'On parcours la table article
                For Each oDataRow In oDataSetBaseApi.Tables("article").Rows
                    'On compare les codes barre
                    If oDataSetBaseApi.Tables("article").Rows(j).Item("codebarre") = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text Then
                        'Si on trouve le code barre
                        Dim oProduit As ClProduit
                        Try
                            strCodBar = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text
                            strRef = oDataSetBaseApi.Tables("article").Rows(j).Item("code")
                            strLib = oDataSetBaseApi.Tables("article").Rows(j).Item("nom")
                            dblTTC = oDataSetBaseApi.Tables("article").Rows(j).Item("prixbasettc")
                            blnVis = CBool(oDataSetBaseApi.Tables("article").Rows(j).Item("sommeil"))
                            intConstructeur = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(2).Tag
                            intType = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(3).Tag
     
                            oProduit = New ClProduit(strRef, strCodBar, strLib, dblTTC, "", blnVis, intConstructeur, intType)
                            oProduit.Ajouter()
                            oProduit = Nothing
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        End Try
                        'On recharge les differents elements.
                        Exit For
                    End If
                    j += 1
                Next oDataRow
                pgb1.PerformStep()
            Next i
    end if
        End Sub
    je ne sais est ce que j'ai bien placé le test ou non
    bon voilà

  10. #10
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par azerty53
    J'enleve le tag résolu parce que j'ai encore un soucis de thread sur un autre formulaire. et je vois pas du tout, tout le semble bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Private oAdo As ClAdoNet
        Private Delegate Sub transfertDonnees()
        Private Th As Thread
     
    'Cette sub, s'occupe d'effectuer des transferts de données entre bases de données.
    Private Sub Traitement()
            Dim i, j As Integer
            Dim oDataSetBaseApi As DataSet
            Dim oDataRow As DataRow
            Dim strRef As String
            Dim strLib As String
            Dim dblTTC As Double
            Dim blnVis As Boolean
            Dim strCodBar As String
            Dim intConstructeur As String
            Dim intType As String
     
            oAdo = New ClAdoNet
     
            oDataSetBaseApi = oAdo.ChargerDonnees("Select * from article", "article", True)
     
            For i = 1 To ModPanelConsommable.lvListeAttente.Items.Count
                j = 0
                'On parcours la table article
                For Each oDataRow In oDataSetBaseApi.Tables("article").Rows
                    'On compare les codes barre
                    If oDataSetBaseApi.Tables("article").Rows(j).Item("codebarre") = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text Then
                        'Si on trouve le code barre
                        Dim oProduit As ClProduit
                        Try
                            strCodBar = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(1).Text
                            strRef = oDataSetBaseApi.Tables("article").Rows(j).Item("code")
                            strLib = oDataSetBaseApi.Tables("article").Rows(j).Item("nom")
                            dblTTC = oDataSetBaseApi.Tables("article").Rows(j).Item("prixbasettc")
                            blnVis = CBool(oDataSetBaseApi.Tables("article").Rows(j).Item("sommeil"))
                            intConstructeur = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(2).Tag
                            intType = ModPanelConsommable.lvListeAttente.Items(i - 1).SubItems(3).Tag
     
                            oProduit = New ClProduit(strRef, strCodBar, strLib, dblTTC, "", blnVis, intConstructeur, intType)
                            oProduit.Ajouter()
                            oProduit = Nothing
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        End Try
                        'On recharge les differents elements.
                        Exit For
                    End If
                    j += 1
                Next oDataRow
                pgb1.PerformStep()
            Next i
        End Sub
     
    'Bouton qui lance l'opération.
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Création du thread
            If IsNothing(Th) Then
                Th = New Thread(AddressOf Traitement)
                Th.Start()
                Invoke(New transfertDonnees(AddressOf Traitement))
                Th = Nothing
            End If
            MsgBox("Transfert(s) éffectué(s) correctement...", MsgBoxStyle.Information, "Transfert(s) OK.")
        End Sub
    Sur la ligne ou il doit comparer le code barre du dataset et le code barre contenu dans le listview il me sort ca comme exception.


    Mon thread me parrait bon, alors est ce que je doit faire le start avant le invoke? d'ou peut venir le probleme ??

    PS: Je suis sous VS2005

    Cordialement.
    Normal tu n'as pas le droit d'appeller un controle dans un thread autre que le thread principale !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Bonjour azerty53,

    si tu as 5 min va voir le message 3 de ce post, il y a un lien qui pourrait t'être utile, si si je t'assure. Lis le et fais comme c'est marqué dans l'exemple.

    Bye.

Discussions similaires

  1. Comment rendre générique la structure de données d'un ListView ?
    Par altropus dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/12/2009, 10h14
  2. Recherche sur les données d'une ListView
    Par malayika dans le forum Windows Forms
    Réponses: 0
    Dernier message: 02/04/2009, 15h57
  3. Réponses: 2
    Dernier message: 04/06/2008, 01h31
  4. Insertion de données triés dans listview
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/04/2007, 15h45
  5. Thread et donnée d'une classe
    Par Bayard dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 12/03/2007, 12h54

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