Пример 1. Цикл бездействует примерно 15,6 мс. , вместо указанных 1 мс на итерацию. Я обнаружил, что это сделано из-за разрешения часов Windows.
Пример 2: Цикл точный, но имеет относительно высокую загрузку ЦП. Похоже, это цикл занятости, который я пытался исправить с помощью Thread.Sleep(0) или Thread.Yield(), но загрузка ЦП остается относительно высокой.
Есть ли способ создать цикл с высокой частотой опроса, который будет точным (т. е. на него не влияет погрешность в 15 мс) и не будет перегружать ресурсы ЦП?
Код: Выделить всё
// Assume my loop is supposed to be 1000hz (1ms per iteration)
void Example1()
{
int i = 0;
// Sleeps for 15ms instead of 1ms.
while(true)
{
i++;
Thread.Sleep(1);
}
}
void Example2()
{
Stopwatch stopwatch = Stopwatch.StartNew();
long prevElapsed = 0;
int i = 0;
while (true)
{
// Accurate to 1ms but relative high CPU usage
// for just incrementing a counter 1000 times per sec.
if (stopwatch.ElapsedMilliseconds - prevElapsed >= 1)
{
i++;
prevElapsed = stopwatch.ElapsedMilliseconds;
}
}
}
- (неточно)
Код: Выделить всё
Thread.Sleep(1); - (неточно)
Код: Выделить всё
await Task.Delay(1); - (неточно)
Код: Выделить всё
System.Timers.Timer; - (неточно)
Код: Выделить всё
System.Threading.Timer; - с помощью Thread.Yield() или Thread.Sleep(0) (точно, но относительно высокая загрузка ЦП)
Код: Выделить всё
Stopwatch
Подробнее здесь: https://stackoverflow.com/questions/793 ... -loop-in-c
Мобильная версия