Пример 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;[*]
Код: Выделить всё
Stopwatch< /ul>
Есть ли способ добиться высокой частоты опроса, при которой каждая итерация будет ближе к 1 миллисекунде, не перегружая процессор и не полагаясь на методы, на которые влияет разрешение часов ОС?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -loop-in-c
Мобильная версия