Bref, me revoici une fois de plus pour vous dire que, en m'attaquant au BackGroundWorker, je pensais que ça allait être simple, du genre :
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For Each files In My.Computer.FileSystem.GetFiles(mediafold)
Listbox1.items.Add(files)
Next
End Sub
Si seulement...
Bref, il a fallut que j'aille voir sur MSDN et j'ai vu qu'il fallait utiliser un "deleguate", or j'ai rien saisis du tout a son utilisation
Si quelqu'un pourrait m'aider sur ce point, cela serait vraiment sympas de sa part .
A toi de parfaire le code en libérant les ressources utilisées, de gérer correctement les erreurs prévisibles par des conditions (if,select case...) et les autres par des blocs Try/Catch. Ce n'est qu'un code exemple non optimisé
foliv57
Messages postés420Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention15 juillet 20149 5 mai 2013 à 10:44
Bonjour,
Le principe est simple. On ne doit pas interagir avec un élément graphique (ListBox dans votre exemple) avec un BackGroundWorker.
En complément des liens de cmarotte, voici un exemple pour votre cas.
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For Each files In My.Computer.FileSystem.GetFiles(mediafold)
AjouteItem(files)
Next
End Sub
Private Delegate Sub AjouteItemDelegate(ByVal valeur As String)
Private Sub AjouteItem(ByVal valeur As String)
If Me.InvokeRequired Then 'Si l'appel est fait par un autre thread
'On appel la même fonction par un Delegate
Me.Invoke(New AjouteItemDelegate(AddressOf AjouteItem), New Object() {valeur})
Else
'On ajoute l'item (Ici on peut interagir avec les éléments de la form)
Me.ListBox1.Items.Add(valeur)
End If
End Sub
Il faut utiliser cette méthode à chaque fois que vous voulez modifier des propriétés d'éléments graphiques de vos formulaires.
Pour retracer d'autres exemples, tu peux utiliser un programme gratuit qui permet une recherche simultanée dans à peu près tout ce que Microsoft peut fournir comme exemples de programmes. All-In-One Code Framework disponible ici (La page est en Anglais, mais l'interface du programme devrait apparaître en Français au lancement)
En tout cas merci a vous foliv57, maintenant mon application ne se fige plus.
Mais dernière question, n'y aurait-il pas un moyen d'ajouter les élément au fur et à mesure ? Car attendre la fin du processus est un peu long dans certain cas...
Vous n’avez pas trouvé la réponse que vous recherchez ?
foliv57
Messages postés420Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention15 juillet 20149 10 mai 2013 à 19:03
Ne vous inquiétez pas, avec le delegate, l'ajout se fait bien au fur et à mesure et pas en fin de processus.
Ce qu'il faut comprendre, c'est que l'accès aux éléments graphiques ne doit pas être fait par deux backgroundworcker en meme temps.
Donc avec un exemple imagé, pour accéder aux formulaire il faut traverser une barrière. Et l'accès se fait chacun son tour, un à la fois. Dans tout ça, si on veut, le delegate et le ticket d'attente. On prend un ticket avec "new delegate" et on se met dans la file avec "me.invoque". On accédera au formulaire des que possible.
foliv57
Messages postés420Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention15 juillet 20149 10 mai 2013 à 19:17
Par contre si vous parlez du fait que le formulaire ne se rafraichit qu'en fin de processus, vous pouvez forcer son rafraichissement après chaque ajout en faisant "me.refresh()" juste en dessous de "me.listbox1.items.add("
Merci foliv57, votre code marche super bien, a une chose près...
Je vois bien la fenêtre se rafraîchir (car il y a une sorte de clignotement) mais pas d'item dans la listbox...pourtant l'application recherche bien les fichiers...
Je ne comprend pas
J'ai même essayé en mettant "Me.Listbox1.refresh" mais toujours rien, il faut attendre la fin du processus...
Bref, j'ai utiliser le code de Banana32 et il fonctionne même sans le backgroundworker, mais en plein milieu du scan, il ralenti mon PC et bouffe ma rame a fond, mais bon, les scans ne sont pas encore trop long ça va