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

- - Dernière réponse :  Utilisateur anonyme - 19 mai 2013 à 11:49
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.
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
7
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de foliv57
3
Merci
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é

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
0
Merci
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)
Commenter la réponse de Utilisateur anonyme
0
Merci
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...
Commenter la réponse de tictac08
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
7
0
Merci
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.
Commenter la réponse de foliv57
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
7
0
Merci
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("
Commenter la réponse de foliv57
0
Merci
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...
Commenter la réponse de tictac08
0
Merci
Et en prime sa plante sur le dossier "SYSTEM VOLUME INFORMATION"
Commenter la réponse de tictac08
0
Merci
Salut,

Une longue discussion à déjà eu lieu sur ce thème ici.
Bonne lecture
Commenter la réponse de Utilisateur anonyme
Commenter la réponse de Utilisateur anonyme
0
Merci
Presque, il ne manque plus qu'une ligne :D



Je suis bloquer, que dois-je mettre sur cette ligne ?
Commenter la réponse de tictac08
0
Merci
Heu... De quelle ligne parles-tu ?
Commenter la réponse de Utilisateur anonyme
0
Merci
Me.Invoke(New AjouteItemDelegate(AdressOf ChercheImages), New Object(????))
Commenter la réponse de tictac08
0
Merci
Il ne t'avais pas affiché l'image sur mon autre post ??
Commenter la réponse de tictac08
0
Merci
Il ne t'avais pas affiché l'image sur mon autre post ??


Pantoute
Commenter la réponse de Utilisateur anonyme
0
Merci
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
Commenter la réponse de tictac08

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.