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:
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...........