Calcul heure [Résolu]

Signaler
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Bonsoir le forum,

Je souhaite estimer l'heure de fin d'une boucle qui créé x fichiers.

Dans la boucle, pour le premier fichier, j'effectue :
            If countwordfile = 0 Then
Dim heuredebut As DateTime = CDate(DateTime.Now.ToString("HH:mm:ss"))
System.Threading.Thread.Sleep(24000) ' 24000 -> 24 secondes
Dim heurefin As DateTime = CDate(DateTime.Now.ToString("HH:mm:ss"))
Dim diff As DateTime = returnTimeDiff(CDate(heuredebut), CDate(heurefin))
End If

   Private Function returnTimeDiff(ByVal HeureDeb As DateTime, ByVal HeureFin As DateTime) As String
Dim diff As TimeSpan = HeureFin.Subtract(HeureDeb)
Return diff.Hours.ToString("00") & ":" & diff.Minutes.ToString("00") & ":" & diff.Seconds.ToString("00")
End Function

La variable diff me retourne 00:00:24

Question:
Comment, si boucle de 500 fichiers à créer, obtenir l'heure de fin prévisionnelle de la boucle -->> heuredebut + (diff x 500)

Merci de vos suggestions.

6 réponses

Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
343
Bonjour,

tout d'abord sur le code présenté, quand tu affectes 1 à un integer ou "coucou" à un string, tu ne les convertis pas en integer pour 1 et en string pour "coucou", alors pourquoi convertir des DateTime en DateTime, ceci fonctionne pareil, avec 4 opérations de conversion en moins sur 3 lignes => gain de temps d'exécution!

        Dim heuredebut As DateTime = DateTime.Now
        System.Threading.Thread.Sleep(24000) ' 24000 -> 24 secondes
        Dim heurefin As DateTime = DateTime.Now
        Dim diff As String = returnTimeDiff(heuredebut, heurefin)



Pour chronométrer quelque chose, il y a la classe StopWatch
https://msdn.microsoft.com/fr-fr/library/system.diagnostics.stopwatch(v=vs.110).aspx

Ceci fait pareil, avec moins à écrire
        Dim chrono As New Stopwatch()
        chrono.Start()
        System.Threading.Thread.Sleep(24000) ' 24000 -> 24 secondes
        chrono.Stop()
        Dim diff As TimeSpan = chrono.Elapsed


On voit que le chrono retourne un TimeSpa, qui représente une durée, exactement ce que tu cherches. Quand tu as une valeur unitaire et un multiplicateur, tu peux multiplier directement le total de minutes ou de seconde du timeSpan.
D'autre part la classe DateTime possède des méthode AddQuelqueChose, qui permettent d'ajouter une durée à la date de départ:
        Dim duree As TimeSpan = TimeSpan.FromSeconds(24)
        Dim dureeTotale As Double = duree.TotalSeconds * 500
        Dim DateFin As DateTime = DateTime.Now.AddSeconds(dureeTotale)


Une autre façon est d'ajouter directement un timeSpan à un DateDatime
        Dim duree As TimeSpan = TimeSpan.FromSeconds(24 * 500)
        Dim DateFin As DateTime = DateTime.Now + duree
Messages postés
2068
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
17 février 2020
85
bonjour
Avec l'API GetTickCount() qui te donne un résultat en millisecondes
tu le places avant et après le traitement d'un fichier
Ensuite tu multiplies le temps de recherche par le nombre de fichiers
Tu ne le fais uniquement que pour le premier fichier

<DllImport("kernel32.dll")> Private Shared Function GetTickCount() As UInteger
    End Function


Private function Tempstraitement as uinteger

        Dim debutrecherche As UInteger
       
        debuttraiitement = GetTickCount()
        Traitementdunfichier ' sous-programme traitement d'un fichier 
        return GetTickCount() - debutrecherche
end Function

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour,
Une telle "estimation" n'a de sens :
1) si elle est faite par rapport au nombres de fichiers copiés : que s'ils sont tous d'une taille à peu près identique. Imaginons par exemple que l'on "tombe" sur une série de fichiers dont la taille est de plus en plus grande (l'estimation en prendrait un sacré coup dans l'aile) .
2) si elle est faite en fonction du nombre d'octets copiés par rapport au nombre total (de tous les fichiers) d'octets à copier : que si l'on accepte de dépenser d'abord du temps à faire le calcul du total des octets, puis de commencer la copie de chaque fichier (ralentissement, donc).
3) que si, que l'on soit dans le cas 1) ou le cas 2), l' "état général" de la machine (qui influe sur la vitesse de traitement) est quasi immuable pendant toute la durée de ce traitement.

Il me parait personnellement de très loin préférable de se contenter dans ces conditions d'une simple barre de progression qui a le mérite de montrer que les "choses" avancent, tout en n'en ralentissant l'exécution que le moins possible.
Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
343
Bonjour Uc,
c'est exact, et c'est pourquoi, les estimations de windows sont toujours fantaisistes, mais au moins l'opérateur a l'impression que ça vit.
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220 > Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020

Bonjour, Whismeril,
Certes moins "zoulie", mais très efficace si le propos est de '"rassurer" l'utilisateur : un simple label affichant, tour à tour, le nom des fichiers copiés.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
24
Bonjour le forum,

Bonjour vb95, Whismeril et ucfoutu,

Merci pour toutes explications.

J'ai opté pour la classe StopWatch :
If countwordfile = 0 Then
Dim stopWatch As New Stopwatch()
stopWatch.Start()

System.Threading.Thread.Sleep(12000) ' 12000 -> 12 secondes

stopWatch.Stop()

Dim ts As TimeSpan = stopWatch.Elapsed
Dim elapse As Double = ts.TotalSeconds * fileword.Count
Dim duree As TimeSpan = TimeSpan.FromSeconds(elapse)
Dim heurefin As String = DateTime.Now.AddSeconds(elapse)

UpdateLabelProgressBarElapse("Estimation durée " & Environment.NewLine & New String(" "c, 8) & duree.ToString.Substring(0, 8))

UpdateLabelProgressBarTimeEnd("Estimation heure de fin" & Environment.NewLine & New String(" "c, 10) & heurefin.ToString.Substring(11, 8))

End If
Je n'ai pas besoin d'une grande précision pour évaluer la fin de création des fichiers word.
Tous les templates pèsent entre 280 et 300 ko.
Par contre, le temps d'exécution sera totalement différent si l'application est exécutée au bureau ou en télétravail.
Serveur à Londres et divers proxy font que l'ouverture d'un template word s'effectue :
- au bureau en 8-10 secondes
- chez soi en 2-3 minutes
De même, l'enregistrement et la fermeture de word prend du temps.
J'ai du rajouter un sleep de 20 secondes entre chaque création afin d'éviter les conflits.

Quand à la progressbar, c'est fait !!!

Encore merci et bonne journée à tous.

jean-marc
Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
343
Bonsoir, je te l'ai déjà dit, avec la libraire docx, pas besoin d'ouvrir word, tu crées le fichier, même en fonction d'un modèle existant.
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
24 > Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020

Bonsoir Whismeril,

Je parcours la toile actuellement sur la librairie docx.
J'aurai souhaité ouvrir un thread sur mon problème de word mais c'est contraire à la charte de ce forum (posez une question sur un point précis ...).

jean-marc
Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
343 > cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

Je tacherai de te mettre quelques bouts de code dans la semaine
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
24 > Whismeril
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020

bonjour Whismeril,

Vu avec BunoCS pour tester l'écriture dans ce thread car hier soir c'était impossible, il me demandait à chaque fois de me reconnecter !!!
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
24
Bonsoir le forum,

Correctif :
- création variable heuredebut avec Dim heuredebut As DateTime = DateTime.Now
- heurefin = heuredebut.AddSeconds(elapse)
If countwordfile = 0 Then
Dim stopWatch As New Stopwatch()
Dim heuredebut As DateTime = DateTime.Now
stopWatch.Start()

System.Threading.Thread.Sleep(12000) ' 12000 -> 12 secondes

stopWatch.Stop()

Dim ts As TimeSpan = stopWatch.Elapsed
Dim elapse As Double = ts.TotalSeconds * fileword.Count
Dim duree As TimeSpan = TimeSpan.FromSeconds(elapse)
Dim heurefin As String = heuredebut.AddSeconds(elapse)

UpdateLabelProgressBarElapse("Estimation durée " & duree.ToString.Substring(0, 8))
UpdateLabelProgressBarTimeEnd("Estimation heure de fin" & heurefin.ToString.Substring(11, 8))
End If
Messages postés
14238
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 février 2020
343
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
24
Bonjour Whismeril,

Merci pour ton lien.
Le download de ce software m'est refusé par la Security Policy de ma boite.

Bonne journée,
jean-marc