2009-04-29 8 views
6

내가 while 루프의 끝에서C# Thread.sleep를 즉시

Thread.Sleep(5); 

아래의 코드를 사용하고 깨어. 시도와 반복 사이에 5ms 지연을 시도하십시오.

때로는 16ms 동안 잠자기 상태가됩니다. 이것은 이해하고 받아들입니다. CPU가 쓰레드를 처리하는 시점에 달려 있기 때문입니다. 그러나 일단 다음 반복을 깨우면 잠자기 후 바로 깨어 난 것처럼 보입니다 (타임 스탬프로 로깅 중입니다). 짧은 수면 간격을 사용하는 데 문제가있어 0으로 처리됩니까?

+0

Thread.Sleep()을 호출하는 곳에서 코드를 게시 할 수 있습니까? –

+0

귀찮게하지 마십시오. 타임 스탬프 로깅 코드를 게시하십시오. ;] – bzlm

+1

5ms는 타임 스탬프를 사용하는 경우 오류 범위 내에있는 것 같습니다. StopWatch를 사용하여 다시 시도해보고이 동작이 계속 표시되면 알려주십시오. –

답변

21

대부분의 최신 기계에서는 DateTime.UtcNow의 해상도가 약 10-15ms입니다. (설명서에 NT 3.5 이후 약 10ms라고 나와 있지만). 더 높은 해상도의 타이밍을 원하면 Stopwatch 클래스, 구체적으로 Stopwatch.GetTimestamp()을 참조하십시오.

또한 Stopwatch는 고해상도 타이머를 사용할 수있는 경우에만 사용합니다 (Stopwatch.IsHighResolution은 런타임에 알려줍니다). 그렇지 않은 경우 DateTime.UtcNow.Ticks로 돌아갑니다.

4

대부분의 경우 문제는 단순히 타이머의 해상도가 제한되어 있다는 것입니다. 예를 들어 10ms마다 업데이트 만하면 5ms가 지난 후에도 일부 반복에서 동일한 타임 스탬프가 표시됩니다.

타임 스탬프를 생성하는 데 사용하는 타이머는 무엇입니까?

0

어떤 종류의 시스템을 실행하고 있습니까? 작은 간격은 프로세서 및 지원되는 해상도에 따라 다릅니다. 타이머의 해상도가 16ms 인 핸드 헬드에서 앱을 한 번 실행했습니다. 따라서 하드웨어와 관련된 것일 수 있습니다. 시간을 30ms로 늘리고 작동하는지 확인하십시오.

1

NT 커널에 도입 된 NT 시간 슬라이스가 올바르게 기억되고 XP와 같은 방식으로 활성화 된 경우 5ms 표시 주위에서 올바르게 작동합니다. 우리는 실시간 응용 프로그램을 작성하고 그 문제를 해결했습니다. 지속적으로 5ms의 수면 시간을 가질 수 없습니다. 우리가 발견 한 것은 당신이 때때로 10-16ms를 얻고 때로는 ms를 얻지 못하며 때로는 거의 5ms를 얻지 못한다는 것입니다.

5 년 전쯤에 이러한 테스트를 수행 했으므로 그 이후로 상황이 변경되었을 수 있습니다.