Задержка на миллисекунды в кроссплатформенном C ++ - PullRequest
1 голос
/ 26 мая 2011

Я пишу многоплатформенную внутреннюю библиотеку на C ++, которая в конечном итоге будет работать на платформах Windows, Linux, MacOS и ARM, и мне потребуется время для сна в течение миллисекунд за раз.

У меня есть точный способ сделать это на платформе ARM, но я не уверен, как это сделать на других платформах.

Есть ли способ спать с разрешением в миллисекунды на большинстве платформ или мне нужно что-то особенное для каждой платформы?

Ответы [ 5 ]

7 голосов
/ 26 мая 2011
7 голосов
/ 26 мая 2011

Для Linux и Mac OS X вы можете использовать usleep:

usleep(350 * 1000);

Для Windows вы можете использовать Sleep:

Sleep(350);

РЕДАКТИРОВАТЬ: usleep() спит в течение микросекунд, а не миллисекунд, поэтому необходимо настроить.

2 голосов
/ 26 мая 2011

usleep теоретически обеспечивает разрешение в микросекундах, но зависит от платформы.

Кажется, он устарел в Windows, поэтому вы должны использовать QueryPerformanceCounter (или написать свой слой совместимости).

P.S .: строительная программа в зависимости от sleep s часто является способом катастрофы. Обычно то, что действительно хочет программист, - это ожидание некоторого события, которое произойдет асинхронно. В этом случае вы должны смотреть на ожидаемые объекты, доступные на платформе, такие как семафоры или мьютексы или даже хорошие старые файловые дескрипторы.

1 голос
/ 26 мая 2011

Windows sleep () обеспечивает точность с точностью до миллисекунды, но с точностью до миллисекунды. Джиттер всегда присутствует, особенно при небольших значениях в сильно загруженной системе. Подобные проблемы можно ожидать только с другими не в реальном времени ОС. Даже если приоритет потока, вызывающего sleep (), очень высок, прерывание драйвера может привести к дополнительной задержке в любое время.

Rgds, Martin

1 голос
/ 26 мая 2011

для таймера вы можете использовать boost asio :: deadline_timer , синхронно или асинхронно.Вы также можете посмотреть в boost :: posix_time для точной настройки таймера между секундами, миллисекундами, микросекундами и наносекундами.

...