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 :

Operation inter thread


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Operation inter thread
    Bonsoir,

    J'essaye désespéremment d' appeler la methode add d'un listview à partir d'un backgroundworker_dowork. J'ai fait des recherches et j'ai cru comprendre que je devais utiliser un délégué seulement je ne comprends absolument rien aux exemples donnés. Donc que dois-je faire concretement pour faire un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with listview1
                    .items.add(monitem)
                    .Items(i).ImageIndex = i
                    .Items(i).Group = ListView1.Groups(0)
    end with
    à partir d'une sub qui est appelée dans un backgroundworker_dowork ??

    Si j'ai bien compris je dois déclarer le délégué puis le faire pointer vers ma méthode mais rien de ce que j'essaye ne fonctionne.
    merci beaucoup

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    si tu utilises un backgroundworker, tu n'as pas besoin de délégué
    il faut utiliser le reportprogress (ou un truc dans le genre), tu peux passer l'objet à ajouter au listview en paramètre, et gérer l'évènement qui va avec

    c'est pas très clair dit comme ca, mais au moins ca te donne la piste à chercher, il doit y avoir des tas d'exemples sur le net

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut listview ,backgroundworker,worker thread
    bonjour anatw73
    pas de desespoir ,sinon chez nous à constantine à quelqu'un de desespere on lui dit il ne te reste qu'a te jeter par dessus un des ponts suspendus de la ville qui emjambe des canyons de plus 150 metres de profondeur(un parisien aurait dis jette-toi dans la seine ou un lyonnais le rhone).
    Bref tu n'est pas tres loin de la verite en voulant utiliser un delegue,puisque le backgroundworder l'utilise aussi.
    Pour reprendre espoir voici un exemple de code qui utilise 2 bons delegues pour mettre à jour un listeview en arriere plan :
    code:
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    '1- Aspect peu connu: les Delegues travaillent dans des Thread separes 
    '2 -Un 1er delegue demarre avec sa methode BeginInvoke "explicite"
    ' il cree un thread "worker" separe qui fait la tache d'arriere plan 
    '3/ Un 2eme Delegue Auxiliare se charge de la Maj des controles 
    Imports System.Threading
    Imports System.Text
    Public Class AsyncItemsForm
        'LE 1er DELEGUE 
        Delegate Sub AjouteItemsDelegate(ByVal mesItems As List(Of String))
        'Liste des items pour meubler notre ListView
        Private mesItems As List(Of String) = New List(Of String)
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.Text = "Ajoute Items à ListView"
            'Ajouter un TableLayoutPanel(2 colonnes et 3 lignes)
            '---------------------------
            'Ajouter un NumericUpDown ou l'on peut aller jusq. à 10000 items
            'ligne=0 col=0 
            Me.itemsUpDown.Minimum = 0
            Me.itemsUpDown.Maximum = 10000
            'un bouton 
            'ligne=0  col=1 
            'ajouter un listview
            'ligne=1 span sur 2 col
            Me.ListView1.Items.Clear()
            Me.ListView1.Dock = DockStyle.Fill
     
            'Ajouter un ProgressBar
            'ligne=2 span sur 2 col
            Me.itemsProgressBar.Dock = DockStyle.Fill
            Me.itemsProgressBar.Minimum = 0
            Me.itemsProgressBar.Maximum = 100
        End Sub
        '2eme DELEGUE  qui sera utilise Par AjouteItems
        'pour mise à jour des controles. 
        Delegate Sub MontreProgressionDelegate(ByVal objItem As String, ByVal numeroItem As Integer)
        Private Sub MontreProgression(ByVal objItem As String, _
        ByVal pourCentItem As Integer)
            ' si appel vient directement de l'UI thread(Winform)
            If Me.InvokeRequired = False Then
                Me.ListView1.Items.Add(objItem)
                itemsProgressBar.Value = pourCentItem
            Else
                ' S'il vient du "worker" thread 
                ' met à jour controles asynchroniquement
                ' en appelant son propre delegue
                Dim ObjMontreProgression As MontreProgressionDelegate = _
                    New MontreProgressionDelegate(AddressOf MontreProgression)
                Me.BeginInvoke(ObjMontreProgression, New Object() {objItem, _
                   pourCentItem})
            End If
     
        End Sub
     
        Private Sub AjouteItems(ByVal mesItems As List(Of String))
            ' pret pour Montrer Progression
            Dim pourCentItem As Integer = 0
            MontreProgression("", pourCentItem)
     
            For I As Integer = 0 To mesItems.Count - 1
                pourCentItem = 100 * I / mesItems.Count
                ' Montrer Progression
                MontreProgression(mesItems(I), pourCentItem)
            Next
     
        End Sub
        'Appel à AjouteItems par le biais d'un delegue dans un autre thread
        'Appel Asynchrone <=> AjouteItems.BeginInvoke(mesItems), Nothing, Nothing)
        'Interface Winform n'est pas bloque en attente du resultat
        Private Sub calcButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcButton.Click
            'Initialise le nombre d'items par NumericUpDown
            Me.mesItems.Clear()
            If itemsUpDown.Value > 10000 Then
                MessageBox.Show("votre ListeView est limite à 10000 items")
            Else 'lance "worker thread"
                For i As Integer = 0 To itemsUpDown.Value
                    mesItems.Add("Item" & (i + 1).ToString)
                Next
                Dim objAjoutItems As AjouteItemsDelegate = _
              New AjouteItemsDelegate(AddressOf AjouteItems)
                objAjoutItems.BeginInvoke(mesItems, Nothing, Nothing)
     
            End If
            'raz du NumericUpDown
            itemsUpDown.Value = 0
        End Sub
     
     
    End Class
    j'espere que ta ville est batie en plaine comme lille ou nantes.........sinon...
    bon code...........

Discussions similaires

  1. Thread : Operation inter-threads non valide
    Par conan76 dans le forum VB.NET
    Réponses: 13
    Dernier message: 14/05/2015, 23h50
  2. Réponses: 7
    Dernier message: 09/05/2014, 20h14
  3. [c#]Communication inter thread
    Par chasse dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/12/2006, 21h45
  4. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 10h07
  5. communication inter-thread en c sous linux
    Par splinternabs dans le forum POSIX
    Réponses: 17
    Dernier message: 22/02/2006, 10h34

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