2010-11-23 7 views
4

Я пытаюсь измерить прошедшее время в миллисекундах между событиями нажатия клавиши с помощью таймера отправки, но при объявлении таймера отправки интервалом в 1 миллисекунду, а затем установление события tick не срабатывает каждые 1 миллисекунду, но где-то примерно 10-100 миллисекунд (догадка). Как я могу точно измерить время в миллисекундах, если это событие не срабатывает вовремя? Я делаю это в silverlight, который, похоже, не имеет доступа к System.Timers. То же самое происходит с System.Threading.Timer.Получение истекшего времени с помощью DispatchTimer с точностью до 1 миллисекунда

Вот основы кода:

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

Любые идеи?

ответ

2

Таймер System.Threading в Silverlight является точным вплоть до 20 мс. Обычно вам нужен мультимедийный таймер, если вам нужно лучшее разрешение, но вы не можете получить доступ к ним непосредственно в Silverlight. При этом, с некоторыми существенными настройками и компромиссами, я читал, что можно получить таймер Silverlight с точностью ~ 3 мс мс. Смотрите документы, на которые ссылаются здесь:

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

Обратите внимание, что я не проверял все эти альтернативы самим, но они стоят посмотреть в.

Другой альтернативой является недавно введенный класс System.Diagnostics.Stopwatch. К сожалению, это только иногда таймер высокого разрешения, в зависимости от используемого оборудования. И в документах MS не указывается, как они определяют, действительно ли это высокое разрешение или нет, поэтому ваш единственный вариант - проверить свойство IsHighResolution.

4

Вместо этого запустите Stopwatch и просто вычтите текущие истекшие миллисекунды секундомера с последних прошедших миллисекунд (которые вам нужно сохранить в переменной) при каждом нажатии клавиши.

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

Я проверю это. Но сначала мне кажется, что мне нужно обновить свой проект от silverlight 3 до 4. – 2010-11-23 09:08:39

+1

Это не похоже на поддержку в веб-проекте silverlight. Просто приложения для телефона или xbox. – 2010-11-23 09:46:15

 Смежные вопросы

  • Нет связанных вопросов^_^