2012-01-25 1 views
2

사용자가 뭔가를 할 경우 (이 경우 StackPanel을 터치), 일종의 타이머를 시작해야합니다 (아마 WPF에서 작업 중이므로 DispatcherTimer가 시작될 것입니다). 그리고 특정 시간 내에 다른 터치가 다시 발생하면 그럼 내가 방법을 부를거야. 아마도 두 번 탭 기능을 구현하는 것으로 추측 할 수 있습니다.어떻게 스레드를 사용하여 다른 스레드가 액세스 할 수있는 타이머를 '틱'할 수 있습니까?

내가 이것을 달성하는 가장 좋은 방법 있으리라 믿고있어는, (즉, 자식 스레드가 메인 스레드에 의해 StackPanel의 다시 접촉하는 모든 시간을 확인 할 수있는 시간 범위를 증가하는 방법?)

감사 스레드를 사용하여 통해

답변

6

이렇게하려면 다른 스레드를 시작할 필요가 없습니다.

첫 번째 탭이 발생했을 때의 타임 스탬프를 사용하고 이것을 사용하십시오. 그런 다음 현재 시간에서이 시간을 빼서 시간 범위를 계산할 수 있습니다 @DannyVarod에 의해 제안

private DateTime _lastTap; 
public void TapHandler() 
{ 
    DateTime now = DateTime.UtcNow; 
    TimeSpan span = now - lastTap; 
    _lastTap = now; 
    if (span < TimeSpan.FromSeconds(1)) {...} 
} 

또는, 당신은 (더 정확한 타이밍으로하지만) 동일한 결과를 달성하기 위해 Stopwatch를 사용할 수 있습니다

+1

에서 가져온 DispatcherTimer를 사용하여이 예제를 참조하십시오. 스레드가 필요하지 않습니다. – nos

+0

완벽. 에 딱 맞다. 아침 일찍 너무 빨라야 해. 나에게 10 분을 줘. 나는 대답으로 표시 할 것이다. –

+0

정확하게 (코드 샘플없이) 대답 할 내용입니다. – Nuffin

1

DispatcherTimer 가장 좋은 방법은 처음에 지적한대로으로 지정하면 틱에서 스레드 정렬을 수행 할 필요가 없습니다. 명시 적으로 및/또는 백그라운드 스레드가 필요할 경우 System.Timers.Timer 클래스와 System.Threading.Timer 클래스를 참조하십시오.

단일 클릭과 두 번 클릭을 구분할 수있는 코드 예제는 MSDN (Windows Forms에만 적용되지만 원칙은 동일합니다)에서 확인할 수 있습니다. 또는 this previous question

private static DispatcherTimer clickTimer = 
     new DispatcherTimer(
      TimeSpan.FromMilliseconds(SystemInformation.DoubleClickTime), 
      DispatcherPriority.Background, 
      mouseWaitTimer_Tick, 
      Dispatcher.CurrentDispatcher); 

    private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     // Stop the timer from ticking. 
     myClickWaitTimer.Stop(); 

     Trace.WriteLine("Double Click"); 
     e.Handled = true; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     myClickWaitTimer.Start(); 
    } 

    private static void mouseWaitTimer_Tick(object sender, EventArgs e) 
    { 
     myClickWaitTimer.Stop(); 

     // Handle Single Click Actions 
     Trace.WriteLine("Single Click"); 
    } 
관련 문제