Calcul heure [Résolu]

cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 25 janv. 2016 à 22:41 - Dernière réponse : cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 26 janv. 2016 à 07:14
1
Merci
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

Merci Whismeril 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de Whismeril
vb95 1590 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 juin 2018 Dernière intervention - Modifié par vb95 le 25/01/2016 à 23:22
0
Merci
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. 
Commenter la réponse de vb95
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 26 janv. 2016 à 07:17
0
Merci
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 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 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.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention > Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 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.
Commenter la réponse de ucfoutu
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 26 janv. 2016 à 13:37
0
Merci
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 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 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.
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention > Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 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
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention > cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 26 janv. 2016 à 19:29
Je tacherai de te mettre quelques bouts de code dans la semaine
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention > Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 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 !!!
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 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
Commenter la réponse de cs_JMO
Commenter la réponse de A.Nonyme
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 28 janv. 2016 à 22:42
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 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
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.