Calcul heure [Résolu]

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

Votre réponse

14 réponses

Meilleure réponse
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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é 88 internautes ce mois-ci

Commenter la réponse de Whismeril
Messages postés
1706
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 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.
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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.
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
>
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 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
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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.
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
>
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 26 janv. 2016 à 19:29
Je tacherai de te mettre quelques bouts de code dans la semaine
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 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 !!!
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 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
Messages postés
12263
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 novembre 2018
- 28 janv. 2016 à 22:42
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 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.