2010-11-23 3 views
4

디스패치 타이머를 사용하여 키 누르기 이벤트 사이의 경과 시간을 밀리 초 단위로 측정하려고하지만 디스패치 타이머를 1 밀리 초 간격으로 선언 한 후 틱 이벤트를 설정하면 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

Silverlight의 System.Threading 타이머는 약 20ms까지만 정확합니다. 일반적으로 더 나은 해상도가 필요한 경우 멀티미디어 타이머가 필요하지만 Silverlight에서 직접 사용할 수는 없습니다. 즉, 몇 가지 중요한 조정과 절충점을 통해 ~ 3ms ms의 정확도를 갖는 Silverlight 타이머를 얻을 수 있음을 읽었습니다. 나 자신을 모든 대안을 테스트하지 않았습니다

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 속성을 확인하는 것입니다.

+0

3ms처럼 보이는 것이 대안을 찾거나이 스톱 워치 어셈블리를 찾을 때까지 내가 희망 할 수있는 최선입니다. –

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로 프로젝트를 업그레이드해야합니다. –

+1

Silverlight 웹 프로젝트에서는 지원되지 않습니다. 그냥 전화 또는 xbox 애플 리케이션. –

관련 문제