.NET Forms 타이머 관련.

Arpiel/SIMPLE-TIMER: Simple Timer Project using Windows Forms. (github.com)

프로젝트와 실행 가능한 바이너리는 위에 링크에 올려져 있습니다.

.NET 오랬만에 공부하면서 Form로 간단히 타이머 프로젝트를 하나 만들어 봤습니다. 일단 기능상 별 문제는 없는것 같다고 판단은 되는데 좀 미묘한 문제점 하나를 발견했습니다.

현재 구조는 타이머 객체를 이용해서 Timer1은 1초마다 현재시각을 갱신해주고 Timer2는 100ms 마다 동작하면서 시간 측정용 clock 객체에 100ms씩 더하는 구조로 되어있습니다.

그런데 막상 구현해 보고 사용해 보니까 실제로 측정되는 타이머가 현재 시각보다 몃초씩 느려지는 것 같은 현상이 있는 것 같습니다. 구체적으로 측정해 본 것은 아닙니다만 측정 시간이 조금 길어지면 눈치 챌 수 있을 정도로요.

아마 Timer 틱마다 처리해주는 명령어 때문에 100ms 보다 조금씩 느려지는 것 같은데… 제가 C# 개발이 본업이 아니라 이걸 제대로 측정할 방법이 잘 모르겟습니다. 혹시 VS에 이와 관련되어 오차를 측정할수 있을만한 도구 같은게 있을까요?

그리고 프로그램 전체적으로 개선할만한 점이 있다면 조언해 주실수 있는 부분이 있을까요.

1 Like

위의 수정된 코드를 살펴보세요.

  1. System.Windows.Forms.Timer는 정확한 인터벌로 이벤트가 호출되지 않습니다. 이유는 타이머가 UI 스레드의 메시지 루프를 통해 발생하기 때문입니다.

  2. System.Windows.Forms.Timer는 이벤트 호출 메소드의 처리 시간을 고려하지 않습니다. 인터벌이 100ms이고 이벤트 콜 된 메소드의 처리시간이 100ms이라면 총 200ms이 걸립니다.

위의 1, 2의 이유 때문에 시간이 계속 밀리게 됩니다.

위의 문제를 해결하려면 PeriodicTimer를 사용하거나 제가 고친 것 처럼 Stopwatch (또는 타이머 시작 시각을 DateTime.Now 로 기록 후 변화되는 시간을 표시)를 이용할 수 있습니다.

3 Likes