버그 해결을 위한 모든 질문을 던져
+2 votes
402 views

.net에는 여러 타이머가 존재하고 콘솔에서는 2가지를 사용할 수 있는데요.

System.Timers.Timer

System.Threading.Timer 입니다.

 

문제는 어떤 타이머를 사용하든 지정한 interval 에서 약 15ms 씩 밀린다는 건데요.

정확한 interval을 반복할 수 있는 타이머 설정법은 없나요?

 

예) 0.0000초에 타이머를 1초 간격으로 작동시키면 다음 elapse는 약 1.015초에 발생합니다.

이 때문에 초시계를 단순히 1초 간격으로 작동시키면 캡쳐와 같이 11:43:21, 11:48:01 초가 생략될 수 있습니다.

asked (19 point) , 402 views

4 answers

+2 votes
우수 답변

윗 폴리모프님의 답변처럼 Stopwatch를 쓰시면 좀 더 정확한 주기로 실행이 가능합니다.

다만 해당 답변은 문제가 있는데 작업이 너무 오래 걸리면 Sleep함수에 음수가 들어갈 수 있고 예외를 내뿜습니다.

다음과 같이 Stopwatch를 계속 실행시키는 식으로 코드를 수정하면 해당 예외를 방지할 수 있습니다.

bool isLoop = true;   //false가 되면 루프 중지
Stopwatch stopwatch = new Stopwatch();

private void Run()
{
   stopwatch.start();
   long prevTime = stopwatch.ElapsedMilliseconds;

   while (isLoop)
   {
      long currentTime = stopwatch.ElapsedMilliseconds;
      if (currentTime - prevTime >= 1000)
      {
         prevTime = currentTime;

         //주기적 작업 수행
      }
   }
}

 

참고로 ElapsedMillisecond 대신에 Elapsed.TotalMilliseconds를 쓰시면 double 수준에서 제어가 가능합니다.

물론 이것도 작업이 정해진 시간 간격 이상 길어지면 일정하게 실행이 불가능하지만 예외는 방지할 수 있을 겁니다.

 

answered (103 point)
선택됨
+1 vote

15ms 단위라니까  윈도우 기본 타이머 인터럽트 주기에 영향이 있는거 같은데요

제가 C# 은 잘 몰라서   그냥 윈도우 API 기준으로만 설명 드립니다.  아마도 관련이 있지 않을까 합니다.

 

https://docs.microsoft.com/en-us/sysinternals/downloads/clockres

ClockRes 를 사용하면 현 시스템의 타이머 해상도 확인이 가능 합니다.  받아서 실행 해보시면 윈도우 기본 타이머는 15.6ms 이며, 현재 타이머 주기도 확인 됩니다.  이 주기는   윈도우 API 로는 timeBeginPeriod 로 타이머 해상도 변경이 가능합니다. 

더 자세한 내용은 C# 프로그래머 분들이 도와주시기를

 

answered (222 point)
0 votes
주기적 작업이 정해진 시간을 벗어나지 않는다고 가정할 때 Stopwatch class를 이용한 편법

Stopwatch timer = new Stopwatch();
int Delay = 1000; // 1초마다

while(계속해야되면)
{
  timer.Reset();
  timer.Start();
  주기적으로 해야할일실행();
  timer.Stop();
  Thread.Sleep(Delay - timer.ElapsedMilliseconds);
}
answered (84 point)
Stopwatch 클래스는 정밀도가 높지만, Thread.Sleep은 호출하기만 해도 최소 15ms 정도 딜레이가 생기지 않나요?
+1 vote
구글링 해보니 앞에 분들이 추천한 StopWatch를 사용하여 클래스로 만든 것도 있습니다.

https://code.i-harness.com/ko-kr/q/17b03c1

(기계 번역이라서 글이 매끄럽지는 않습니다)
answered (116 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

127 질문
222 answers
253 댓글
246 users