BackGroundWorker...pas si simple finalement [Résolu]

Signaler
-
 Utilisateur anonyme -
Bien le bonjour à toute la communauté VBFrance

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 .

Merci d'avance à ceux qui vont me répondre.

16 réponses

Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
6
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.

il ralenti mon PC et bouffe ma rame a fond
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é

Bonjour,

Voici quelques exemples Microsoftiens que tu devrais pouvoir adapter à tes besoins

Application Windows Forms

VB 2010 et VB 2012 vont la convertir au besoin.

ASP.net VB2012

ASP.net et VB 2010Tapez le texte de l'url ici.

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)
Bonjour, et désolé du temps de réponse.

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...
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
6
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.

Bien entendu cette explication est simpliste.
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
6
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...
Et en prime sa plante sur le dossier "SYSTEM VOLUME INFORMATION"

Salut,

Une longue discussion à déjà eu lieu sur ce thème ici.
Bonne lecture

Et celle-ci avec les threads
Presque, il ne manque plus qu'une ligne :D



Je suis bloquer, que dois-je mettre sur cette ligne ?

Heu... De quelle ligne parles-tu ?
Me.Invoke(New AjouteItemDelegate(AdressOf ChercheImages), New Object(????))
Il ne t'avais pas affiché l'image sur mon autre post ??

Il ne t'avais pas affiché l'image sur mon autre post ??


Pantoute
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