2010-11-23 6 views
4

J'essaie de mesurer le temps écoulé en millisecondes entre les événements de pression de touche en utilisant un temporisateur d'envoi, mais en déclarant qu'un temporisateur d'envoi a un intervalle de 1 milliseconde, puis en établissant l'événement de tick ne se déclenche pas toutes les 1 millisecondes mais quelque part comme 10-100 millisecondes (devinez). Comment puis-je mesurer le temps en millisecondes avec précision si cet événement ne se déclenche pas à temps? Je le fais en Silverlight qui ne semble pas avoir accès à System.Timers. La même chose semble arriver avec System.Threading.Timer.Temps écoulé avec DispatchTimer à une précision de 1 milliseconde

est ici les bases du code:

public void StartTimer(object o, RoutedEventArgs sender) 
{ 
    System.Windows.Threading.DispatcherTimer myDispatcherTimer = new 
    System.Windows.Threading.DispatcherTimer(); 
    myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); // 1 Milliseconds 
    myDispatcherTimer.Tick += new EventHandler(Each_Tick); 
    myDispatcherTimer.Start(); 
} 

// A variable to count with. 
int i = 0; 

public void Each_Tick(object o, EventArgs sender) 
{ 
    i++; 
} 

public void keypress(object s, EventArgs args) 
{ 
    label1.contents = i.ToString(); 
    i = 0; 
} 

Des idées?

Répondre

2

Le temporisateur System.Threading dans Silverlight n'est précis que jusqu'à environ 20 ms. Normalement, vous voudriez un minuteur multimédia si vous aviez besoin d'une meilleure résolution, mais vous ne pouvez pas y accéder directement dans Silverlight. Cela dit, avec quelques ajustements et compromis importants, j'ai lu qu'il est possible d'obtenir une minuterie Silverlight qui a ~ 3 ms de précision. Voir les documents référencés ici:

http://blogs.msdn.com/b/nikola/archive/2009/08/19/exposed-5-methods-to-create-game-loop-which-is-the-best.aspx

Notez que je ne l'ai pas testé toutes ces alternatives moi-même, mais ils sont dignes d'intérêt.

Une autre alternative est la classe System.Diagnostics.Stopwatch récemment introduite. Malheureusement, ce n'est que parfois une minuterie haute résolution, selon le matériel que vous utilisez. Et les documents MS ne spécifient pas comment ils déterminent si c'est vraiment haute résolution ou non, donc votre seule option est de vérifier la propriété IsHighResolution.

+0

On dirait que 3ms est le meilleur que je puisse espérer jusqu'à ce que je puisse trouver une alternative ou trouver ce montage chronomètre. –

4

Lancez plutôt un Stopwatch et soustrayez simplement les millisecondes actuelles du chronomètre des dernières millisecondes écoulées (que vous devez stocker dans une variable) chaque fois que vous appuyez sur une touche.

private Stopwatch _stopwatch; 
    private int _lastElapsedMs; 

    public void StartTimer(object o, RoutedEventArgs sender) 
    { 
     _lastElapsedMs = 0; 
     _stopwatch = Stopwatch.StartNew(); 
    } 

    public void keypress(object s, EventArgs args) 
    { 
     int elapsedMs = (int)_stopwatch.ElapsedMilliseconds; 
     int currentElapsed = (elapsedMs - _lastElapsedMs); 

     _lastElapsedMs = elapsedMs; 

     label1.contents = currentElapsed.ToString(); 
    } 
+0

Je vais vérifier. Mais il semble d'abord que je doive mettre à jour mon projet de Silverlight 3 à 4. –

+1

Il ne semble pas être pris en charge dans un projet web Silverlight. Juste des applications de téléphone ou de xbox. –

Questions connexes