Пример 1 находится в режиме ожидания более 1 мс на итерацию. Вместо этого на итерацию уходит примерно 15 миллисекунд, что, как я обнаружил, связано с разрешением часов Windows.
Пример 2 — точный, но относительно высокий уровень загрузки ЦП. Кажется, это цикл занятости, который я пытался исправить с помощью Thread.Sleep(0) или Thread.Yield(), но загрузка ЦП не намного снизилась.Есть ли способ создать цикл с высокой частотой опроса, который был бы точен (т. е. на него не влияет погрешность в 15 мс) и не перегружал бы ресурсы ЦП?
< предварительно class="lang-cs Prettyprint-override">
Код: Выделить всё
// 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
Мобильная версия