System.Threading.Thread.Sleep(500). Utilise la propriété Interval du timer
Timer1.Stop
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim MyThread As BackgroundWorker = CType(sender, BackgroundWorker) 'récupération du thread d'arrière plan Dim pourcent As Integer MyThread.ReportProgress(pourcent) 'pourcent est un Integer indiquant l'état d'avancement. 'ici le code de l'action a démarrer End Sub Private Sub BackgroundWorker1_ProgressChanged( _ ByVal sender As Object, _ ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged ProgressBar1.Value = e.ProgressPercentage ProgressBar1.Style = ProgressBarStyle.Marquee tmrlabel.Start() ' déplacement du texte dans le label lblmessage.Text = " Veuillez patienter......La durée de l'opération est proportionnelle au nombre de frames. " 'label défilant End Sub 'Quand le code d'arrière plan est terminé la procédure RunWorkerCompleted est exécutée. Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _ ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted ProgressBar1.Style = ProgressBarStyle.Blocks ProgressBar1.Value = 100 ' ici, elle affiche un message indiquant que le thread d'arrière plan est terminé. ' MessageBox.Show("Opération réussie, vous pouvez enregistrer le gif animé si vous le désirez. ", "Affichage du gif animé", MessageBoxButtons.OK, MessageBoxIcon.Information) lblmessage.Text = " Opération réussie..... Vous pouvez enregistrer le gif animé si vous le désirez. " 'label défilant End Sub Private Sub tmrlabel_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrlabel.Tick ' déplacement du texte dans le label lblmessage.Text = Mid(lblmessage.Text, 2, lblmessage.Text.Length - 1) & Mid(lblmessage.Text, 1, 1) End Sub
BackgroundWorker1.RunWorkerAsync()
Private Sub action() compteurfichiers = 0 compteurrepertoires = 1 ' on compte le répertoire source CompterDir(New DirectoryInfo(TextBox1.Text)) End Sub
BackgroundWorker1.RunWorkerAsync()
MyThread.ReportProgress(pourcent)
System.Threading.Thread.Sleep(500)là où il est placé ne met pas l'application en pause : il rallonge la duéee du processus du Timer et il y a un risque qu'un nouveau déclenchement du Timer intervienne avant que le processus du déclenchemnt précédent ne soit terminé
Imports System.ComponentModel
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private Message As String = "Patientez "
Private compteurfichiers As Integer
Private compteurrepertoires As Integer
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Timer1.Enabled = False
Label3.Visible = False
Label3.BackColor = Color.White
End Sub
Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick
Message = Message.Substring(1, Message.Length - 1) & Message.Substring(0, 1)
Label3.Text = Message
End Sub
Private Sub CompterDir(ByVal oSource As DirectoryInfo)
Try
'Compte tous les fichiers d'un répertoire (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
' on compte que les fichiers ( pas les répertoires)
If oFichier.Attributes <> FileAttributes.Directory Then compteurfichiers = compteurfichiers + 1
End Sub)
'Comptage (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()
' on compte le répertoire
compteurrepertoires = compteurrepertoires + 1
' on va compter les fichiers du répertoire
CompterDir(oSousRepertoire)
Next
Catch ex As Exception
End Try
End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Label3.Text = Message
Label3.Visible = True
Timer1.Enabled = True
Timer1.Start()
compteurfichiers = 0
compteurrepertoires = 1 ' on compte le répertoire source
BackgroundWorker1.RunWorkerAsync() ' on lance le processus de comptage en BackGround (tâche de fond)
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
' processus de comptage en BackGround
CompterDir(New DirectoryInfo("C:\")) ' répertoire racine C:\ pour l'exemple ( à modifier )
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
' fin processus Background et retour dans le processu de la form du projet
Label1.Text = compteurrepertoires.ToString & " Répertoires"
Label2.Text = compteurfichiers.ToString & " Fichiers"
Label3.Text = String.Empty
Label3.Visible = False
Timer1.Stop()
Timer1.Enabled = False
End Sub
End Class
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
For i = 0 to 499
' le traitement pour chaque fichier
MyThread.ReportProgress(pourcent)
Next
MyThread.ReportProgress(pourcent)permet de signaler à la Form le pourcentage effectué dans le BackGround ; il faut
BackgroundWorker1_ProgressChangeddans la form qui se charge d'afficher le pourcentage sur la barre de progression
MyThread.ReportProgress(pourcent)uniquement pour la copie de fichiers et surtout pas à la création de répertoire .
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
Private CopieCpier As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Timer2.Enabled = True
Timer2.Start()
CopieCpier = 0
BackgroundWorker2.RunWorkerAsync()
End Sub
#Region " Copier Fichiers / Dossiers"
Private Destination As String
Private Source As String
Private Sub CopyDir(ByVal oSource As DirectoryInfo, ByVal oDestination As DirectoryInfo)
Try
oDestination.Create() 'Création du répertoire de destination (le cas échéant)
'Copie de tous ses fichiers (utilise le parallélisme pour de meilleures performances)
Parallel.ForEach(oSource.GetFiles(), Sub(oFichier As FileInfo)
oFichier.CopyTo(Path.Combine(oDestination.FullName, oFichier.Name))
CopieCpier = CopieCpier + 1
End Sub)
'Copie (par récursivité) de tous ses sous-répertoires
For Each oSousRepertoire As DirectoryInfo In oSource.GetDirectories()
CopyDir(oSousRepertoire, oDestination.CreateSubdirectory(oSousRepertoire.Name))
Next
Catch ex As Exception
End Try
End Sub
Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
ActionCopier()
End Sub
Sub ActionCopier()
Destination = TextBox1.Text
Source = TextBox2.Text
If Directory.Exists(Destination) = True Then
If MessageBox.Show("Le répertoire destination existe déjà : voulez-vous l'effacer ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.No Then
Exit Sub
Else
Directory.Delete(Destination, True)
End If
End If
CopieCpier = 0
CopyDir(New DirectoryInfo(Source), New DirectoryInfo(Destination))
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = CopieCpier.ToString
End Sub
Private Sub BackgroundWorker2_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker2.RunWorkerCompleted
MessageBox.Show("copie terminée")
Label1.Text = CopieCpier.ToString
Timer2.Stop()
End Sub
#End Region
End Class
CopieCpier = CopieCpier + 1
CopieCpier = oFichier.Length
16 nov. 2016 à 16:23
16 nov. 2016 à 16:36
bonjour à toi
Au fait j'ai modifié mes Scrabbles
Pour le dictionnaire je n'utilise plus un tableau de 26 arcs par nœud avec Redim mais une list(of Arcs) . Pourquoi mettre 26 arcs si le nœud n'en comporte qu'un seul d'utile par exemple .Et la méthode Find me permet de trouver l'indice de l'arc associé à une lettre donnée .
Les méthodes Find, Where, etc.... sont bien concises en code mais pas facile de trouver de la doc dessus mis à part les réponses anglophones .
Mais avec de la logique et du tâtonnement on avance
16 nov. 2016 à 16:37
merci de m'avoir répondu
Vb95tu veux dire comme ça :
là le message ne s'affiche même pas ni avant ni après avoir compte le nombre de fichiers/Dossiers, si l’enlève Timer1.Stop le message s'affiche qu'après avoir compter le nombre de fichiers / Dossiers
16 nov. 2016 à 16:50
il faut comprendre que maintenant avec la puissance de nos PC les opérations en boucle se font assez rapidement ( surtout en plus que la sub CompterDir utilise le Parrallel.ForEach : cela revient à faire plusieurs boucles simultanées)
Quelle est la valeur de la propriété Interval de ton Timer ? Par défaut c'est 100 je crois soit 100 millisecondes
Utilises un à la fin de la sub duTimer pour rafraichir l'affichage du label
Je teste de mon côté
16 nov. 2016 à 17:09
Après test cela ne fonctionne pas
Il faudrait mettre la sub Compterdir dans un BackGroundWorker pour éviter qu"elle bloque la Form et que le Timer puisse interférer sur la Form