2010-11-29 7 views
0

J'ai utilisé un ex de stackoverflow mais parfois mon timer se déclenche deux fois: cette horloge devrait se déclencher toutes les minutes, mais supposons qu'elle se déclenche 00: 00: 59.666 puis step1 = 59; étape2 = 59; étape3 = 1; return (1000-666); donc il devrait tirer pas la minute suivante mais prochaine 333 mili seconde, que puis-je faire?Timer Tirer deux fois

public int SyncTime = 60; 
Clock = new System.Timers.Timer {AutoReset = false}; 
      Clock.Elapsed += DoJob; 
      Clock.Interval = GetSync(SyncTime); 
      Clock.Start() 
    private void DoJob(object sender, ElapsedEventArgs elapsedEventArgs) 
    { 

      Clock.Interval = GetSync(SyncTime); 
      Clock.Start(); 

    } 
    private static double GetSync(int syncTime) 
    { 
     DateTime now = DateTime.Now; 
     int step1 = (now.Minute * 60 + now.Second); //amount of miliseconds in this hour 
     int step2 = step1 % syncTime;    //amount of miliseconds since last update 
     int step3 = syncTime - step2;    //amount of miliseconds to next upadte 
     return (step3 * 1000 - now.Millisecond); 
    } 
+5

Votre code est incomplet ... vous semblez avoir des énoncés au milieu de nulle part, sans aucun point-virgule après l'un d'entre eux. Si vous pouviez créer un programme court mais complet qui démontre le problème, vous auriez beaucoup plus de chances d'obtenir une réponse. –

+0

En outre, à quelle heure synchronisez-vous? Et pourquoi? –

+0

cela est complet, j'ai même donné ex comment ce plaisir peut retourner une valeur erronée, je cherche la réponse – kosnkov

Répondre

0

Je pense que la question est dans la ligne:

Clock = new System.Timers.Timer {AutoReset = false}; 

Je pense que cela devrait lire:

Clock = new System.Timers.Timer {AutoReset = true}; 

Cela signifie que la minuterie ne se déclenche une fois jusqu'à ce que vous réémettez la commande Start.

+0

Poster réédite la commande start dans sa fonction "DoWork". – Adrian

+0

noo j'aime tirer une seule fois, puis synchroniser l'heure et tirer à nouveau, AutoReset = false signifie que la minuterie ne tirera qu'une seule fois – kosnkov

+0

@ user428547 - Désolé, vous avez raison. {Embarrassé} – Enigmativity

0

Ok, je ne sais pas si c'est la réponse à votre problème spécifique, mais votre fonction GetSync calcule incorrectement le temps restant jusqu'à la minute complète.

Il devrait être (à moins que je manque quelque chose qui est tout à fait possible):

private static double GetSync(int syncTime) 
{ 
    DateTime now = DateTime.Now;  
    return ((2 * syncTime) - now.Second) * 1000) - now.Millisecond; 
} 

Cela peut résoudre votre problème en calculant le temps restant de cette façon ne sera jamais vous conduire à retourner une valeur 0 de GetSync.

EDIT: Mal compris le calcul a ajouté 2 * le temps de synchronisation qui va le calculer correctement maintenant si je le comprends correctement.