현재 동일한 코드를 정확히 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를 덜 사용하는 방법이 있습니까? 특정 시간 동안 정확하게 기다리는 다른 방법이 있습니까?
답변 해 주셔서 감사합니다. PerformanceCounter와 Thread.Sleep을 조합하여 사용하고 있으며, 현재 수행중인 작업에 대해 충분히 정확하다고 보입니다. 나는 지속적으로 초당 100 틱을 받고 있으며 CPU 사용량은 0-1 %로 줄었습니다. 해상도를 높이고 전력 소비를 늘릴 필요가 없습니다. :) – haiyyu
@haiyyu 'timeBeginPeriod (1)'을 활성화하면 청력이 다소 향상됩니다. 그러나 분명히 바쁜 기다림 만큼은 아닙니다. 불행히도 나는 이것에 열심히 숫자가 없다. – CodesInChaos
음, 그렇다면 내가 그 중 어느 것도 사용하지 않는다는 것을 아는 것이 좋다. :) – haiyyu