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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 073 fois - Téléchargée 19 fois

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

Ajouter un commentaire

Commentaires

fifrelin70
Messages postés
31
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
16 mars 2009

fifrelin70
Messages postés
31
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
16 mars 2009

Bonjour, désolé de répondre si tardivement.
Je vais bientôt poster le projet complet et oui il gère les exceptions de fichiers et de dossier (simple utilisation de Try / Catch Ex as Exception /Finally / End Try)
.Toutefois je signale simplement les erreurs sans les corriger.

Pour les curieux, le projet comporte plusieurs notion :
_gestion de filtre sur les répertoires et sauvegarde dans un fichier XML
_implémentation de méthode Clone
_pattern singleton pour la passerelle vers la classe XML
_compteur d'instances de la classe C_Erreur qui hérite d'exceptions
_création de délégués et d'événements personnalisées.

Je poste très vite le lien du projet. ++
TroXsA
Messages postés
553
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 octobre 2016
1
Bonjour,

Juste pour savoir si ton code gère les exceptions de fichiers et de dossier système ou non accessible ?

Cordialement,
Adn56
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
vivement que tu finisses ton BTS que nous puissions lire la source en entier ;)
++
fifrelin70
Messages postés
31
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
16 mars 2009

Merci pour ton commentaire Charles331. N 'hésite pas à me cooriger sur s'autres points si tu constates des erreurs de synthaxe.

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.