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 |
Partager