cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013
-
17 juil. 2013 à 15:24
cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013
-
17 juil. 2013 à 16:51
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
4u4me4us
Messages postés780Date d'inscriptionlundi 22 janvier 2007StatutMembreDernière intervention30 octobre 20133 17 juil. 2013 à 16:02
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.
cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013 17 juil. 2013 à 16:51
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.