System.Threading.Thread.Sleep(500). Utilise la propriété Interval du timer
Timer1.Stop
Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire
202 internautes nous ont dit merci ce mois-ci
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
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
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
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
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é
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
j'ai fais comme tu à suggérer, mais rien n'a lair d'avoir changer :
quand j'ai ajouté un (qui met l'application en pause)
je voulais que les résultats du timer auront le temps s'afficher