Backgroundworker rafraîchissement du formulaire pendant la tâche de fond

Contenu du snippet

Voici mon premier code source.
Dans la réalisation d'un supercopieur ( = BACKUP) j'ai du avoir recours au thread mais également du trouver comment rafraîchir mon formulaire en temps réel pendant la copie.
Le but est d'afficher le nb de fichiers, dossiers etc copiés.
Après quelques recherches j'ai finalement trouvé une solution que je propose ici.
Je ne poste pas ici le code entièrement car il rentre dans le cadre d'un pti BTS de fin d'année...

Je dispose de 3 classes:
1 classe LesReperoires qui contient ma collection de répertoires
1 classe Repertoire qui contient ma collection de fichiers
1 classe Fichier

La méthode Copy est une méthode de la classe LesRepertoires. C'est elle qui demande un thread pour s'éxécuter. Depuis ma classe LesRepertoires je crée des événements avec paramètres et grâce aux Délégués je lance des opérations asynchrones qui me permettent de rafraichir le form (autrement dit de sortir du thread du background pour entrer ds le thread principal)

Ceci est mon premier projet en vb.net, bonne lecture

Source / Exemple :


'Ma classe C_LesRepertoires
'...//

Public Class C_LesRepertoires

'Evénements
Public Event Ev_Copy(ByVal NbReperoiresCopies as Integer, ByVal NbFichiersCopies as Integer, ByVal TailleCopiee as Long)
'Rapporte le nombre de répertoires copiés, le nombre de fichiers copiés et la taille totale copiée
Public Event Ev_CopyError(ByVal Fichier as C_Fichier, ByVal Err as Exception, ByVal NbErr as Integer)
'Rapporte le fichier non copié, l'erreur de la copie et le nombre total d'erreurs

'...//
'Attributs
'Constructeur
'Accesseurs
'//

'Méthode Copy qui copie les répertoires et fichiers
'Il faut envoyer le SENDER du form_principal

Public Sub Copy(ByVal Destination as String, ByVal Sender as Object)
Dim MonThread as BackgroundWorker
MonThread = Ctype(Sender, Backgrounder) 'récupération du thread d'arrière plan

'...//
'Mon exécution longue...//
RaiseEvent Ev_Copy(F.Get_Path, FichierDest)
'Autre exécution...//
RaiseEvent Ev_CopyError(F, Ex_NoAccess, nbErreur)
'Pour rafraichir la progress bar
MonThread.ReportProgress(CInt(tailleCopie/ _RepertoireLen * 100) 'Soulève l'événement ProgressChanged du BackgroundWorker (ici le pourcentage de la progressBar en paramètre)
'...//

End Class 

'DANS NOTRE FORMULAIRE PRINCIPAL
'COMMENT RECUPERER LES PARAMETRES DE LA CLASSE POUR RAFRAICHIR UN TXTBOX DATAGRID OU AUTRE...

'EN ENTETE
Public WithEvents m_ListOfDir As New C_LesRepertoires(My.settings.source) 'on instancie LesRepertoires
'importance de WithEvents

'HANDLES DE NOS 2 EVENEMENTS PERSOS
Public Sub Ev_Copie(ByVal nb_rep as Integer, ByVal nb_fic as Integer, ByVal taille as long) Handles m_ListOfDir.Ev_Copy
Invoke(NewChangeLblDestinationHandler(AddressOf ChangeDataLbl), nb_rep, nb_fic, taille) 'opération asynchrone avec nos paramètres
End Sub

'... 2eme evenement Ev_ErrorCopy

'Nos DELEGUES
Private Delegate SUb ChangeLblDestinationHandler(ByVal Nb_R as Integer, ByVal Nb_F as Integer, ByVal Size As Long)

'...2eme delegue

'ENFIN ON ECRI DS NOTRE FORM EN TPS REEL CEST PAS BO SA ;)
Private Sub ChangeDataLbl(ByVal nb_rep as Integer, Byval nb_fic as Integer, Byval Taille as Long)
Me.Lbl_Dest.Text = "Contenu transféré : " & func_RoundTaille(Taille) _
& " / " & nb_Fic & " Fichiers / " _
& nb_rep - 1 & "Dossiers" 
End Sub

Conclusion :


Ce code source vous donne le principe à vous de l'agrémenter.
Mon programme met en jour durant la copie un datagrid avec rapport d'erreur et un textbox qui ramène à chaque fois qu'est copié un dossie rou un fichier le nouveau nb dans le text box du form.
Je n'ai pa ajouté dans la source le fait de changer la valeur de la Progress Bar.
Bref, tout ça pour dire que ça marche

A voir également

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.