Bonjour,
Je développe en VB .net, a l'aide de la technologie windows form.
Je développe actuellement un script permettant de lire l’intégralité d'un fichier excel et d'en extraire les éléments essentiels. Ces fichiers excel sont très gros (30k lignes), et le traitement prend un peu moins d'une minute. J'ai pu simplement intégrer une progressBar avec l'avancé en fonction du nombre de ligne total et du nombre de ligne traité, code présent dans la même boucle while (qui lit l'intégralité du fichier Excel). Voici la boucle while corespondante :
J'ai aussi voulu integrer un champs ETA (Estimmated Time Arrival), pour ceci, j'ai intergrer un timer et une fonction retournant environ le temps restant a l'aide du temps passé et des lignes traité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Inc = 0 SecondEleapsed = 0 Timer1.start While appXls.ActiveSheet.Range("A" & 1 + inc).Value.ToString <> "" If IsNumeric(appXls.ActiveSheet.Range("A" & 1 + inc).Value) = False And appXls.ActiveSheet.Range("A" & 1 + inc).Value.ToString <> "Export effectué le :" Then lstElement.Items.Add(appXls.ActiveSheet.Range("A" & 1 + inc).Value) End If inc = inc + 1 TotPercent = TotPercent + incpercent lblProgress.Text = "Lecture du fichier : " & Math.Round(TotPercent, 2) & " %" ProgressBar1.Value = Math.Truncate(TotPercent) End While
Je lance donc mon timer avant ma boucle While, mais une fois la boucle while engagé, le while prend le dessus par rapport à l’événement tick du timer, ce qui fais que mon timer ne déclenche jamais.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Dim inc As Integer = 0 'Le nombre de ligne traité depuis le lancement de la procédure Dim SecondEleapsed As Integer 'Le nombre de de seconde passé depuis le lancement de la procédure Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick SecondEleapsed = SecondEleapsed + 1 txtETA.Text = ETA() End Sub Private Function ETA() As String Dim ETARes As Double ETARes = (SecondEleapsed * nbrLineTot) / inc Return ETARes End Function
J'ai pensé a un background worker, mais je ne sais pas comment il fonctionne et je n'ai pas réussi a trouver ce qui me convenais sur internet pour l'instant.
Je m'en remet donc a vous, d'avance merci a toutes les personnes qui se pencheront sur mon problème !
Partager