2010-06-08 3 views
3

C# .Net에서 시계 응용 프로그램을 만들고 있습니다. 0-9의 각 숫자에 대한 이미지가 있습니다. 나는 모든 초 시계 응용 프로그램

DispatcherTimer tmr = new DispatcherTimer(); 
tmr.Interval = TimeSpan.FromSeconds(1); 
tmr.Tick += new EventHandler(tmr_Tick); 
tmr.Start(); 

void tmr_Tick(object sender, EventArgs e) 
    { 
     dt = DateTime.Now; 
     UpdateSecondsImages(dt); 
    } 


private void UpdateSecondsImages(DateTime dt) 
    { 
     secondSource2 = dt.Second % 10; 
     secondDigit2.Source = digimgs[secondSource2]; 
     if (secondSource2 == 0) 
     { 
      secondSource1 = dt.Second/10; 
      secondDigit1.Source = digimgs[secondSource1]; 
     } 

     if (secondSource1 == 0) 
     { 
      UpdateMinuteImages(dt); 
     } 
    } 

하지만 지금 직면하고있는 문제를 틱 메인 페이지 생성자에서 타이머를 가지고하는 것은이 코드가 제안 성능 관점에서이 원활하게 다른 방법을 minute.Please에 대한 두 번째를 건너 뛸 수있다 보기의.

+1

당신은 WPF 또는 GDI를 사용하고 있습니까? 만약 당신이 GDI를 사용한다면 WPF – Darknight

+1

을 제안한다. 나는 타이머 인터럽트를 더 자주하고 시간을 읽지 않고 계산할 것이다. – kenny

+0

Kenny, 코드 샘플을 좀 더 알려 주시겠습니까? –

답변

3

심플. 매 초마다 타이머가 울리면 "잠에서 깨어나 알려주려면 적어도 1 초에 잔으십시오."라고 말합니다. 실제로, 당신은 훨씬 더 오래 자고있을 수 있습니다. 또한 서로 다른 타이밍 API는 서로 상대적으로 클록 드리프트를 갖는다. 타이머가 기반으로하는 시계는 DateTime.Now가 기반으로하는 시계와 다를 수 있습니다. 이 같은 그것의

생각해 - 이제 당신이 실제로마다 1.02 초 깨어 수 있습니다 가정 해 봅시다. 따라서 50 초마다 렌더링에서 비트를 건너 뜁니다. 예를 들어 "49.98"에서 깨어나서 (49로 렌더링) 다음 번에 "51.00"에서 깨어납니다.

간단한 해결 방법은 1 초보다 적은 때로는 잠이다. 귀하의 경우, 전체 초 대신 500-750 밀리 초 사이에 잠자는 것이 좋습니다. 동일한 두 번째 간격 내에서 웨이크 업하는 경우 다시 같은 시간을 다시 렌더링 할 수 있습니다. 또는 사소한 최적화로서, 이미 깨어 났을 때 아무것도하지 마십시오. 이전의 시간 이후로 두 번째 카운트가 변경되지 않았습니다.

는 말을하려고 : tmr.Interval = TimeSpan.FromMilliSeconds (500); 그들이 볼 때에 만 시계를 보여 괜찮아 경우

+0

안녕하세요, 소리가 좋아요. 똑같은 논리를 시도했습니다. 이제는 초 사이에 건너 뛰기가 없지만 연속 된 두 자리 사이의 전환 시간은 때로 다릅니다. 또한 응용 프로그램 memmory를 먹고 있습니다. 이것은 전화 응용 프로그램이기 때문에 memmory constraints를 줄 때 너무 많은 비용이 듭니다. –

+1

Windows에서 트레이 타이머의 "초"수를 표시하지 않는 이유에 대한 Raymond Chen의 기사를 읽어야합니다. http://blogs.msdn.com/b/oldnewthing/archive/2003/10/10/55256.aspx – selbie

+0

게시자가 게시 한 멋진 링크이지만 초를 표시하는 응용 프로그램도 보았습니다 .-- ( –

1

, 차라리 CompositionTarget.Render 이벤트 핸들러를 사용하는 것이 좋습니다 것입니다. 현재 시간을 가져 와서 UI를 적절히 업데이트하십시오. 이렇게하면 오류가 제거 될뿐만 아니라 밀리 초를 렌더링 할 수 있습니다 :).

이 접근법이 성능에 영향을 줄지는 의심 스럽지만 (cos() 및 sin()은 당일 치욕적입니다). 그러나 (수천 클럭을 렌더링하더라도) 모든 프레임이 아닌 UI를 업데이트 할 수 있습니다.

희망이 도움이됩니다.

관련 문제