2009-04-29 2 views
6

Я использую ниже кодC# Thread.Sleep пробуждение сразу

Thread.Sleep(5); 

в конце цикла. Чтобы попытаться получить 5 мс задержки между итерациями.

Иногда он спит в течение 16 мс. Это я понимаю и принимаю, поскольку это зависит от того, когда ЦП оборачивается вокруг обслуживания потока. Однако, как только он разбудил следующую итерацию, он, похоже, разбудил сразу после сна (я регистрируюсь со временными отметками). Есть ли проблема с использованием такого короткого интервала ожидания, что он рассматривается как ноль?

+0

Можете ли вы разместить код, в котором вы вызываете Thread.Sleep()? –

+0

Не беспокойтесь. Просто опубликуйте код регистрации метки времени. ;] – bzlm

+1

5 мс кажется, что он находится в пределах погрешности, особенно если вы используете временные метки. Повторите попытку с помощью StopWatch и сообщите нам, если вы все еще видите это поведение. –

ответ

21

Ваша проблема такая, как на большинстве современных машин, DateTime.UtcNow имеет разрешение около 10-15 мс (хотя я вижу, что в документации говорится, что это около 10 мс с NT 3.5). Если вы хотите получить более высокое разрешение, см. Класс Stopwatch, в частности Stopwatch.GetTimestamp().

Также обратите внимание, что секундомер будет использовать только таймеры с высоким разрешением, если они доступны (Stopwatch.IsHighResolution расскажет вам во время выполнения). Если нет, он возвращается к DateTime.UtcNow.Ticks.

4

Скорее всего, проблема в том, что ваш таймер имеет ограниченное разрешение. Если он обновляется, скажем, каждые 10 мс, вы увидите одну и ту же метку времени на некоторых итерациях, даже если прошло 5 мс.

Какой таймер вы используете для создания временных меток?

0

В какой системе вы работаете? Небольшие интервалы могут зависеть от процессора и от того, насколько высокое разрешение оно поддерживает. Я запускал приложение на карманном компьютере, когда разрешение самого таймера составляло 16 мс. Так что это может быть связано с оборудованием. Попробуйте увеличить период времени, чтобы сказать 30 мс и посмотреть, работает ли он тогда.

1

Если я правильно помню NT-срез, который был введен в ядре NT и по-прежнему активен точно так же, как и у XP, он работает примерно с отметкой 5 мс. Мы строили приложение в реальном времени и столкнулись с этой проблемой. Вы не сможете последовательно получать время сна 5 мс. Мы обнаружили, что вы иногда получаете 10-16 мс, иногда нет мс, а иногда и редко получаете 5 мс.

Я делал эти тесты около 5 лет назад, хотя с тех пор все изменилось.

Смежные вопросы