Цикл высокочастотного опроса в C#?C#

Место общения программистов C#
Ответить
Anonymous
 Цикл высокочастотного опроса в C#?

Сообщение Anonymous »

Я пытаюсь создать высокочастотный цикл опроса на C#, но у меня проблемы с точностью и загрузкой ЦП.
Пример 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;
}
}
}
Я пробовал разные методы, но ни один из них не оказался одновременно точным (около 1 мс на итерацию) и эффективным использованием ЦП: Есть ли способ добиться высокая частота опроса, при которой каждая итерация составляет около 1 миллисекунды, без нагрузки на процессор и без использования методов, на которые влияет разрешение часов ОС?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -loop-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»