Gestion d'un label dans un background worker

Signaler
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013
-
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013
-
Bonjour tout le monde,

Je développe actuellement un programme qui fait une liste de fichiers, pour cela j'utilise un background worker.
J'ai mis en place une progressbar, dans la partie DoWork du background worker j'utilise la fonction ReportProgress pour actualiser celle-ci.
Pour cette partie je n'ai pas de problème, le problème vient de la gestion d'un label, je l'avais premièrement intégré dans la partie DoWork, ce qui m'a valu une erreur "Opération inter-threads non valide", il faut donc que je mette à jour le label au même endroit que la progressbar.

Mon but est d'afficher le nom du fichier en cours de traitement. J'ai une variable qui le contient dans la partie DoWork ("Dim fichier_p As String") du Background worker, mais je ne sais pas comment l'intégrer dans la partie "backgroundworker_ProgressChanged". La source que j'ai suivie au début utilisait une fonction CType, j'ai essayé de l'adapter à ma situation puisque je possède une public classe "File" avec une variable "nom". Mais sans succès, quelqu'un a-t-il des idées ?

Voici le code de la partie "backgroundworker_ProgressChanged" :

Private Sub backgroundworker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        If e.ProgressPercentage <= 100 Then
            Me.ProgressBar1.Value = e.ProgressPercentage
            'Label1.Text = "Vérification de '" & fichier_p & "'..."
            Label1.Text = "Vérification de '" & CType(e.UserState, File).Nom
        Else
            Me.ProgressBar1.Value = 100
        End If
    End Sub


Voici la public class "file" :
    Public Class File
        Dim _Nom As String
        Dim _Taille As Long
        Sub New(ByVal nom As String, ByVal Taille As Long)
            _Nom = nom
            _Taille = Taille
        End Sub
        Sub New()

        End Sub
        Property Nom As String
            Set(ByVal value As String)
                _Nom = value
            End Set
            Get
                Return _Nom
            End Get
        End Property
        Property Taille As Long
            Set(ByVal value As Long)
                _Taille = value
            End Set
            Get
                Return _Taille
            End Get
        End Property
    End Class


Cordialement
A voir également:

2 réponses

Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
Je n'ai peut-être pas une bonne vue de ta situation donc sorry si je suis à coté de la plaque. Il me semble que d'une manière ou d'une autre tu connais le nom du fichier avant le traitement?

Si c bien le cas la ligne la gestion du label ne doit pas être dans l'événement ProgressChanged.

Tjs dans mon hypothèse, disant que l'utilisateur doit cliquer sur le bouton "traitement" alors de l'événement clique du bouton sera organisé de la façon suivante :
Dim fichier_p As String
fichier_p=le nom du fichier que j'obtiens par x ou y raison 
Label1.Text = "Vérification de '" & fichier_p & "'..."


Si l'utilisateur doit cliquer sur le non du fichier a traiter via une lite boxe :
fichier_p=listeboxe1.....
Label1.Text = "Vérification de '" & fichier_p & "'..."


Je me trompe peut-être mais dès le moment ou tu connais le nom du fichier tu peux l’assigner a ton label.

Note que si je suis à coté de la plaque envoyer tout le code en entier ne m’aidera pas. Montre plus tôt comment tu trouves le nom du fichier.
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Tout d'abord merci de votre réponse, je pense que la gestion du label doit être dans l'évènement ProgressChanged puisque c'est impossible qu'elle se trouve dans le background worker .

En gros, mon programme se divisive en ces quelques parties :

1-je clique sur un bouton qui lance un background worker

2-le background worker se lance donc et fait une liste de fichiers en récupérant des informations pour chacun
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
...
            Dim fichier_p As String = fichier.FullName.Replace(Application.StartupPath, "").Substring(1)
...
création de la liste (boucle)
...
    End Sub

Le nom de chaque fichier est récupéré par la variable fichier_p qui est présente dans le background worker (marche bien). Lorsque la création de la liste est finie le background worker se ferme.

3-Le background worker envoie des informations quant à l'avancement de la création de la liste (une progressbar : fonctionne ; et un label qui doit afficher le nom du fichier dont on extrait les informations soit la variable fichier_p : ne fonctionne pas)
Private Sub backgroundworker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        If e.ProgressPercentage <= 100 Then
            Me.ProgressBar1.Value = e.ProgressPercentage
            Label1.Text = "Vérification de '" & CType(e.UserState, File).Nom   ' ne fonctionne pas
        Else
            Me.ProgressBar1.Value = 100
        End If
    End Sub


Le problème est que si je met la mise à jour du label dans la boucle présente dans le background worker, cela donne donc une erreur "Opération inter-threads non valide" puisque pour modifier une form il faut qu'elle soit dans le thread principal. Donc j'ai essayé de mettre en place le label dans "Private Sub backgroundworker_ProgressChanged". Mais je ne sais pas comment récupérer la variable présente dans le background worker pour pouvoir l'insérer ici.

Est-ce plus clair ainsi ?