C # Тема. Сон бодрствования сразу - PullRequest
6 голосов
/ 29 апреля 2009

Я использую код ниже

Thread.Sleep(5);

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

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

Ответы [ 4 ]

21 голосов
/ 29 апреля 2009

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

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

4 голосов
/ 29 апреля 2009

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

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

1 голос
/ 29 апреля 2009

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

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

0 голосов
/ 29 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...