Bonjour à tous,
Décidément je n'arrête pas en ce moment de vous solliciter.
J'ai un petit souci avec les Timer de mon programme en WPF.
Le client à besoin d'écrire un rapport des mesures effectuées toutes les X minutes dans un fichiers en local et sur un serveur sftp.
Le souci c'est que s'il règle le Timer à 1 minutes, il veux qu'après 24h il a 1440 fichiers.
Vu comme sa pas de souci, mais un dispatcherTimer, apparemment, commence à recompter après la sortie de l'évènement. Sur une journée, entre l'écriture des fichiers et l'envoie vers le SFTP j'ai un décalage, léger certes, mais j'ai pas les 1440 fichiers.
Pour m'affranchir du temps de traitement d'écriture et envoie, dans l'évènement tick du timer je créé uniquement un BackgroundWorker, et c'est lui qui gère ensuite les fichiers.
Malgré cela j'ai un petit décalage dans le temps, d'une seconde sur une 15 éne de fichiers (donc 1 secondes toutes les 15 minutes).
Comment gérer cela pour être toujours parfaitement caller à la seconde prêts ? et avoir mes 1440 fichiers en 24H.
Ralentir le temps c'est facile en ajoutant un sleep, mais l'accélérer ??
Justement, en parlant de ralentir le temps, j'ai fait un test:
Lors de la déclaration de mon Timer, j'ai enlevé 200 millisecondes sur l'intervalle.
Et j'initialise un DateTime de réference.
Puis je fait cela:
Conclusion:
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
17
18
19
20
21
22
23
24 private void bdtTimer_Tick(Object sender, EventArgs ev) { //TimeRéf est initialisé lors du démarrage du timer //BaseDeTempsMS est le délais entre chaque écriture. //Calcul du temps manquant (200ms étant déduit de BaseDeTempsMS lors de la déclaration du timer) TimeSpan Diff = (DateTime.Now - TimeRef) ; int millisec = BaseDeTempsMS - (int)Diff.TotalMilliseconds; //Si il manque du temps je fait une pause de ce temps. if (millisec > 0) { System.Threading.Thread.Sleep(millisec); } //J'ajoute au temps de référence, la valeur de l'intervalle réel souhaité. TimeRef = TimeRef.AddMilliseconds(BaseDeTempsMS) ; BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; //Je passe au BackgroundWorker le temps réel afin de l'écrire dans le nom du fichier et voir sont évolution. worker.RunWorkerAsync(DateTime.Now); }
Avec ce code, en réglant le timer à 1 minutes, j'ai un petit écart entre les fichiers, mais cela se stabilise toujours autour des mêmes valeurs en ms. On a bien la même minute +1 à chaque fois et les mms oscille entre 325 et 385, je pourrais essayé de les caller vers les 500 ms afin de ne jamais basculer d'une seconde..
Cela fonctionne donc, mais c'est quand même de la bidouille. Si vous avez d'autre suggestion je suis preneur, merci.
Partager