2012-06-08 2 views
0

현재 동일한 코드를 정확히 100 번 실행하는 응용 프로그램을 작성하려고합니다. .NET 프레임 워크의 내장 타이머를 사용하여 몇 가지 테스트를 수행했습니다. 필자는 System.Threading.Timer 클래스, System.Windows.Forms.Timer 클래스 및 System.Timers.Timer 클래스를 테스트했습니다. 그들 중 누구도 내가하려고하는 것에 대해 충분히 정확하지는 않습니다. PerformanceCounters에 대해 알아 냈으며 현재 응용 프로그램에 구현하려고합니다. 그러나 Idle 할 때 내 CPU의 전체 코어를 차지하는 프로그램에 약간의 문제가 있습니다. 초당 100 회 활성화하면됩니다. 내 루프는 다음과 같습니다 : 당신이 볼 수 있듯이PerformanceCounter in while 루프

long nextTick, nextMeasure; 

QueryPerformanceCounter(out start); 
nextTick = start + countsPerTick; 
nextMeasure = start + performanceFrequency; 

long currentCount; 
while (true) 
{ 
    QueryPerformanceCounter(out currentCount); 

    if (currentCount >= nextMeasure) 
    { 
     Debug.Print("Ticks this second: " + tickCount); 
     tickCount = 0; 
     nextMeasure += performanceFrequency; 
    } 

    if (currentCount >= nextTick) 
    { 
     Calculations(); 
     tickCount++; 

     nextTick += countsPerTick; 
    } 
} 

는, 대부분의 시간은 프로그램이 지속적으로 while 루프를 통해 실행하여 다시) (계산을 실행하기 위해 기다리고있을 것입니다. 이것을 막을 수있는 방법이 있습니까? 내 컴퓨터가 느리게 실행되는 것을 원하지 않는다. System.Thread.Thread.Sleep도 불행히도 꽤 "부정확"하지만 다른 해결책이 없다면 사용하는 것이 좋을 것입니다.

기본적으로 묻는 것은 무한 루프를 CPU를 덜 사용하는 방법이 있습니까? 특정 시간 동안 정확하게 기다리는 다른 방법이 있습니까?

답변

1

timeBeginPeriod(1)과 정상적인 타이머 또는 Thread.Sleep이 적절하게 작동해야합니다.

이것은 전역 효과가 있음에 유의하십시오. Windows 타이머가 더 자주 실행되도록하여 CPU 절전 시간을 단축하므로 전력 소비가 증가한다고하는 주장이 있습니다. 이것은 일반적으로 피해야한다는 것을 의미합니다. 그러나 매우 정확한 타이밍이 필요하다면, 바쁜 대기보다는 확실히 좋은 선택입니다.

+0

답변 해 주셔서 감사합니다. PerformanceCounter와 Thread.Sleep을 조합하여 사용하고 있으며, 현재 수행중인 작업에 대해 충분히 정확하다고 보입니다. 나는 지속적으로 초당 100 틱을 받고 있으며 CPU 사용량은 0-1 %로 줄었습니다. 해상도를 높이고 전력 소비를 늘릴 필요가 없습니다. :) – haiyyu

+0

@haiyyu 'timeBeginPeriod (1)'을 활성화하면 청력이 다소 향상됩니다. 그러나 분명히 바쁜 기다림 만큼은 아닙니다. 불행히도 나는 이것에 열심히 숫자가 없다. – CodesInChaos

+0

음, 그렇다면 내가 그 중 어느 것도 사용하지 않는다는 것을 아는 것이 좋다. :) – haiyyu

2

Windows는 실시간 O/S가 아니므로 코드가 원하는만큼 자주 실행된다는 보장은 없습니다.

다른 말로하면, Thread.Sleep()을 타이머로 사용하는 것이 가장 효율적이라고 말한 적이 있습니다. 기본값보다 더 높은 정확도를 원한다면 원하는 해상도로 millisecond까지 timeBeginPeriod를 발행 할 수 있습니다. 이 함수는 winmm.dll에서 DLL 가져 오기되어야합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. Windows가 실시간 OS가 아니라는 사실을 알고 있습니다. 나는 당신이 게시 한 기능을 사용하여 해상도를 낮추라고 요청할 수 있다는 것을 몰랐습니다. 고맙습니다! 이 부분을 좀 더 살펴보고 내 프로그램을 CPU에 더욱 친숙하게 만드는 데 도움이되는지 확인하겠습니다. – haiyyu