2010-11-23 11 views
4

Ich versuche die verstrichene Zeit in Millisekunden zwischen Tastendruckereignissen mit einem Sendetimer zu messen, aber einen Sendetimer mit einem Intervall von 1 Millisekunde zu deklarieren und dann das Tickereignis zu setzen feuert nicht alle 1 Millisekunde, sondern etwa 10-100 Millisekunden (raten). Wie kann ich die Zeit in Millisekunden genau messen, wenn dieses Tick-Ereignis nicht rechtzeitig ausgelöst wird? Ich mache das in silverlight, das keinen Zugriff auf System.Timers zu haben scheint. Dasselbe scheint mit System.Threading.Timer zu geschehen.Abrufen der verstrichenen Zeit mit DispatchTimer auf 1 Millisekunden Genauigkeit

Hier ist die Grundlagen des Kodex:

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; 
} 

Irgendwelche Ideen?

Antwort

2

Der System.Threading-Timer in Silverlight ist nur bis ca. 20ms genau. Normalerweise würden Sie einen Multimedia-Timer benötigen, wenn Sie eine bessere Auflösung benötigen, aber Sie können nicht direkt in Silverlight auf diese zugreifen. Das heißt, mit einigen wesentlichen Optimierungen und Kompromissen habe ich gelesen, dass es möglich ist, einen Silverlight-Timer mit einer Genauigkeit von ~ 3 ms zu erhalten. Sehen Sie sich die hier Bezug genommen docs:

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

Hinweis, dass ich nicht alle diese Alternativen selbst getestet, aber sie sind diskussionswürdig.

Eine andere Alternative ist die kürzlich eingeführte System.Diagnostics.Stopwatch Klasse. Leider ist dies nur manchmal ein hoher Auflösung Timer, abhängig von der Hardware, auf der Sie laufen. Und die MS-Dokumente geben nicht an, wie sie bestimmen, ob es wirklich hohe Auflösung ist oder nicht, also ist Ihre einzige Option, die IsHighResolution-Eigenschaft zu überprüfen.

+0

Sieht aus wie 3ms ist das Beste, auf das ich hoffen kann, bis ich eine Alternative finden oder diese Stoppuhr-Baugruppe finden kann. –

4

Starten Sie stattdessen eine Stopwatch und subtrahieren Sie einfach die aktuellen verstrichenen Millisekunden der Stoppuhr von den letzten verstrichenen Millisekunden (die Sie in einer Variablen speichern müssen), jedes Mal wenn eine Taste gedrückt wird.

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

Ich werde es überprüfen. Aber zuerst sieht es so aus, als müsste ich mein Projekt von Silverlight 3 auf 4 aufrüsten. –

+1

Es scheint nicht, dass es in einem Silverlight-Webprojekt unterstützt wird. Einfach anrufen oder Xbox Apps. –