2008-11-06 3 views
2

VB.NET 프로그램에 초를 포함하여 시간을 표시하는 시계 기능이 있습니다. 현재 현재 타이머를 사용하여 폴링하고 있습니다. 시스템 시계와 동기화 된 두 번째 업데이트가 필요하기 때문에 시스템 시계를 자주 폴링해야합니다.더 효율적인 시계 기능 작성

초가 변경된 경우에만 시간에 직접 액세스 할 수 있습니까?

이 코드를 작성하는 효율적인 방법이 있습니까?

자세한 정보가 필요하면 알려주십시오.

답변

5

왜 타이머 구성 요소를 사용하지 않습니까? 여기서는 GUI를 사용 중이며 서비스를 작성하지 않는다고 가정합니다.

폴링을 수행하는 동기화 루틴을 호출하여 타이머를 변경하는 초에 매우 근접한 다음 타이머에 위임 할 수 있습니다. 1 분에 1 번 정도 동기화 루틴을 호출하여 OS 드리프트가 발생하지 않도록 할 수 있습니다.

그 말은, 나는 초 변화 이벤트를 감지하는 방법이있을 것이라고 확신하지만, 어떻게해야할지 모릅니다.

업데이트 :

This link 내가 상상 한 것과 유사한 구현을 가지고있다. 루프에 영구히 붙어 있지 않도록 잘 수정하십시오! 당신은 동기화 루틴을 가지고 있습니다.

업데이트 2 : Shog9의 피드백을 바탕으로

, 나는이 폴링보다 더 좋은 방법이 될 수있다 생각은 :

이제
Public Class Form1 
    Private WithEvents clockTimer As New Timer 
    Private currentTime As DateTime = DateTime.MinValue 

    Private Sub ClockTick(ByVal sender As Object, _ 
     ByVal e As System.EventArgs) Handles clockTimer.Tick 

     UpdateTimer() 
     DisplayTimer() 
    End Sub 

    Private Sub UpdateTimer() 
     currentTime = DateTime.Now 

     clockTimer.Stop() 
     clockTimer.Interval = 1000 - currentTime.Millisecond 
     clockTimer.Start() 
    End Sub 

    Private Sub DisplayTimer() 
     lblTime.Text = currentTime.ToString("T") 
    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, _ 
     ByVal e As System.EventArgs) Handles MyBase.Load 

     UpdateTimer() 
     DisplayTimer() 
    End Sub 
End Class 

, 내 예비 시험을 기반으로, 드리프트의 일종에있다 각 Tick 이벤트. 내 컴퓨터에서는 12 ~ 20 밀리 초로 다양했습니다. 누구든지 안정적으로 드리프트를 수정하는 방법에 대한 아이디어가 있다면 학습에 관심이있을 것입니다.

+0

루프에 앉아 시스템 시계를 폴링하는 것이 좋습니다? – Shog9

+0

일시적으로 만. 변곡점을 결정한 후에는 이벤트가있는 시스템 타이머를 호출합니다. –

+2

음 ... 다음 타이머 간격을 밀리 초 단위로 조정하십시오. – Shog9

0

Timer 객체를 사용하여 "interval"을 0으로 설정하고 "enabled"를 true로 설정합니다. 하드웨어 구성에 따라 대략 15 밀리 초마다 실행됩니다. 이 메서드에서 MyLabel.Text = DateTime.Now.ToString() (또는 무엇을하고 있는지)을 설정합니다.

이것은 완벽하게 수행됩니다.

+0

Performant ... 컴퓨터에서 오버 헤드를 감지하지 못했습니까? 또는 실행하는 세미 - 사소한 코드에서 여러 번, 필요한 것보다 몇 번만 더 많은 하드웨어의 응용 프로그램에 큰 문제가 아닌가요? – Shog9