En C#, comment créer un minuteur synchronisé avec tick du système DateTime. La minuterie personnalisée doit cocher chaque fois que les secondes changent pour DateTime.NowMinuteur C# synchronisé avec Datetime.Now
Répondre
Vous trouverez, si vous vérifiez certaines des questions précédentes sur SO, vous aurez beaucoup de mal à obtenir la précision avec votre minuterie. Voici un petit échantillon de questions précédentes:
- Timer takes 10 ms more than interval
- C# Why are timer frequencies extremely off?
- .NET, event every minute (on the minute). Is a timer the best option?
Voici another previous question qui peut vous fournir de l'aide.
Quelle serait la précision désirée? Si vous dites que 1ms est assez précis (ou 10, ou 100), vous pouvez toujours faire une boucle qui compare l'heure actuelle et une enregistrée de l'itération précédente, et démarrer un thread lorsque la valeur des secondes du courant valeur temps ...
Vous pouvez utiliser des bibliothèques de planification, comme Quartz.net, il fournit des exemples et facile à utiliser: http://quartznet.sourceforge.net/
Ce code utilise un System.Threading.Timer. Il regardera le milliseconde-décalage que le déclencheur est appelé. Si l'erreur est en dehors de la plage acceptée, elle réajustera la minuterie et corrigera l'intervalle en faisant la moyenne de l'erreur par tick.
class Program {
const int MAX_ERROR_IN_MILLISECONDS = 20;
const int ONE_SECOND = 1000;
const int HALF_SECOND = ONE_SECOND/2;
private static System.Threading.Timer timer;
static void Main(string[] args) {
timer = new System.Threading.Timer(Tick);
timer.Change(ONE_SECOND - DateTime.Now.Millisecond, ONE_SECOND);
Console.ReadLine();
}
private static int ticksSynced = 0;
private static int currInterval = ONE_SECOND;
private static void Tick(object s) {
var ms = DateTime.UtcNow.Millisecond;
var diff = ms > HALF_SECOND ? ms - ONE_SECOND : ms;
if (Math.Abs(diff) < MAX_ERROR_IN_MILLISECONDS) {
// still synced
ticksSynced++;
} else {
// Calculate new interval
currInterval -= diff/ticksSynced;
timer.Change(ONE_SECOND - ms, currInterval);
Console.WriteLine("New interval: {0}; diff: {1}; ticks: {2}", currInterval, diff, ticksSynced);
ticksSynced = 0;
}
Console.WriteLine(ms);
}
}
Comme vous pouvez le voir, vous ne pouvez pas déclencher exactement sur le deuxième changement dans Windows. Vous pouvez essayer de vous rapprocher.
- 1. retour Synchronisé objectif-c
- 2. Minuteur haute résolution avec C++ et Linux?
- 3. C++ Minuteur ne fonctionne pas?
- 4. Minuteur du processeur Objective C
- 5. C#: DateTime.Now Format de sortie du mois
- 6. un message synchronisé avec nservicebus
- 7. Minuteur haute résolution dans .NET
- 8. inexact. Minuteur .NET?
- 9. objectif-c: synchronisé, comment ça marche?
- 10. DateTime.Now et NullReferenceException
- 11. Comment écrire un minuteur en Objective-C?
- 12. DateTime.Now datetime mysql
- 13. Minuteur dans le service Windows
- 14. DateTime.Now dans une instruction
- 15. Java: put() synchronisé avec une liste d'objets
- 16. Minuteur incrémental
- 17. C#: Comment DateTime.Now peut-il être juste un attribut?
- 18. Minuteur avec intervalle de plusieurs mois
- 19. comment changer les images avec le minuteur
- 20. Minuteur global en Javascript avec plusieurs rappels
- 21. Java synchronisé semble ignoré
- 22. Silverlight datagrid défilement synchronisé
- 23. Optimisation des alternatives à DateTime.Now
- 24. .NET webservice datetime.now - fuseau horaire
- 25. Datetime.Now déterminer ma position incorrecte
- 26. Test d'applications avec iPhone synchronisé avec un PC?
- 27. vimrc pour être multiplate-forme et synchronisé avec Dropbox.
- 28. Synchronisé dans un thread Java
- 29. Liaison de minuteur d'appoint
- 30. Comment convertir DateTime.now en UTC dans Ruby?
Vous devez être déclenché une fois par seconde, ou dans une certaine plage lorsque la seconde a changé? Quel est le but? – GvS
Je veux être déclenché chaque fois que DateTime.Now.Second change. Si je démarre une minuterie avec une durée de 1 seconde, elle ne se déclenchera pas exactement lorsque l'heure du système changera. –
Vous pouvez le faire avec une boucle d'attente occupée, mais j'espère qu'il y a une meilleure façon. –