Calcul heure

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 25 janv. 2016 à 22:41
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 29 janv. 2016 à 09:40
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.
A voir également:

6 réponses

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 janv. 2016 à 07:14
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
1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 25/01/2016 à 23:22
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. 
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 janv. 2016 à 07:17
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.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 janv. 2016 à 07:20
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
26 janv. 2016 à 07:32
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
26 janv. 2016 à 13:37
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
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 janv. 2016 à 16:36
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
26 janv. 2016 à 18:01
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
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
26 janv. 2016 à 19:29
Je tacherai de te mettre quelques bouts de code dans la semaine
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
27 janv. 2016 à 10:39
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 !!!
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
27 janv. 2016 à 20:00
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
28 janv. 2016 à 22:42
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
29 janv. 2016 à 09:40
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
0
Rejoignez-nous