Я знаю, что sleep(x)функция POSIX переводит программу в спящий режим на х секунд. Есть ли функция, чтобы заставить программу спать на х миллисекунд в C ++?
Вы должны знать, что в любом случае в Windows точностьSleep() составляет миллисекунды , но ее точность может быть на несколько порядков выше. Вы можете думать, что вы спите в течение 4 миллисекунд, но на самом деле вы спите в течение 400.
Джон Диблинг
5
@John Dibling: я думаю, что он использует POSIX sleep, а не win32, Sleepучитывая "х секунд".
CB Bailey
1
Хотя C и C ++ имеют различное искажение имен, которое может быть источником ошибок и несовместимости, в большинстве случаев нормально использовать заголовки C в C ++. Однако, если вы хотите быть абсолютно уверены, что ничего не идет не так, #includeиспользуйте заголовок C внутри extern "C" {}блока. Кроме того, если у вас есть исходные файлы C и C ++ в одном и том же проекте, настоятельно рекомендуется сделать это, чтобы избежать каких-либо проблем, особенно если вы включаете одинаковые заголовки в исходные файлы обоих типов (в этом случае это необходимо) , Если у вас есть чисто C ++ проект, он может просто работать без проблем.
adam10603
2
@JohnDibling нет, не 400мс. Худшая точность, которую вы когда-либо получали, была от Windows 9x, GetTickCountразрешение которой составляло 55 мс; более поздние версии имели разрешение 16 мс или меньше. Один пользователь думал, что он получал разрешение 16 мс от Sleep, но затем сообщил, что Sleepсам по себе он был довольно точным, и очевидная неточность была вызвана использованием GetTickCountизмерения времени.
Qwertie
Ответы:
457
Обратите внимание, что стандартного C API для миллисекунд не существует, поэтому (в Unix) вам придется согласиться usleep, что принимает микросекунды:
Вы должны включить <unistd.h> или <Windows.h> соответственно.
gbmhunter
Да, но не может ли фактическое разрешение по времени составлять 15-16 мс (даже если единица измерения в вызове составляет 1 мс) и, следовательно, минимальное время составляет 15-16 мс?
Питер Мортенсен
33
В зависимости от вашей платформы вы можете иметь usleepили nanosleepдоступны. usleepустарела и была удалена из самого последнего стандарта POSIX; nanosleepявляется предпочтительным.
Одна из проблем с этим кодом заключается в том, что это занятый цикл, он будет продолжать использовать 100% одноядерного ядра. Функция sleep реализована вокруг вызова ОС, который переводит текущий поток в спящий режим и делает что-то еще, и активирует поток только по истечении указанного времени.
Исмаэль
Вы правы - он будет потреблять 100% одного ядра процессора. Итак, вот переписанный код с использованием системных спящих функций - и он все еще кроссплатформенный:
Барт Грзибицкий,
@BartGrzybicki Я знаю, что это старый ответ и все, но в Visual Studio 2017 на компьютере с Windows #ifdef WIN32не оценивается как true по умолчанию.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck Код неправильный. Так и должно быть #ifdef _WIN32.
контанго
1
@Контанго, я знал это! Но не тогда, когда я это написал ... лол. Спасибо за продолжение!
kayleeFrye_onDeck
17
nanosleepэто лучший выбор, чем usleep- он более устойчив к прерываниям.
Не используйте слово «стандарт», если вы на самом деле не имеете это в виду. <concrt.h>это не заголовок Стандартная библиотека - это может быть библиотека платформы; в этом случае вы должны четко сформулировать предпосылки.
Тоби Спейт
5
На платформах с этой selectфункцией (POSIX, Linux и Windows) вы можете сделать:
void sleep(unsignedlong msec){
timeval delay ={msec /1000, msec %1000*1000};int rc =::select(0, NULL, NULL, NULL,&delay);if(-1== rc){// Handle signals by continuing to sleep or return immediately.}}
Однако в настоящее время есть лучшие альтернативы.
Невозможно скомпилировать в VS2017 на компьютере с Windows:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck Это компилируется. Просто не связывает. Поиск ваших документов Windows.
Максим Егорушкин
какой заголовок вы используете для timeval ??
Тотте Карлссон
@TotteKarlsson <sys/time.h>.
Максим Егорушкин
4
Способ сна вашей программы на C ++ - это Sleep(int)метод. Заголовочный файл для него#include "windows.h."
Например:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
Время, в течение которого он спит, измеряется в миллисекундах и не имеет ограничений.
Что вы имеете в виду, что нет предела? Это, безусловно, имеет предел, который составляет 0xFFFFFFFE. Ожидание 0xFFFFFFFF просто не истечет (это означает, что оно будет ждать окончания программы).
Иззи
Я не это имел ввиду, Иззи, извини за наше недопонимание. Я имел в виду, что вы можете ввести любое положительное число миллисекунд. Так что будет ждать столько миллисекунд, чтобы закрыть программу. Если вы не понимаете, скажите, пожалуйста, я объясню вам больше.
Пх
Да, но каково его фактическое разрешение по времени? Разве это не может быть 15-16 мс в некоторых случаях? Например, если вы используете Sleep (3), он будет фактически спать в течение 3 мс или вместо этого будет 15-16 мс?
Питер Мортенсен
3
Вызов select - способ повысить точность (время ожидания может быть указано в наносекундах).
Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, измените, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, попробуйте написать это как комментарий.
Тоби Спейт
3
Используйте Boost асинхронные потоки ввода / вывода, спите в течение x миллисекунд;
Sleep()
составляет миллисекунды , но ее точность может быть на несколько порядков выше. Вы можете думать, что вы спите в течение 4 миллисекунд, но на самом деле вы спите в течение 400.sleep
, а не win32,Sleep
учитывая "х секунд".#include
используйте заголовок C внутриextern "C" {}
блока. Кроме того, если у вас есть исходные файлы C и C ++ в одном и том же проекте, настоятельно рекомендуется сделать это, чтобы избежать каких-либо проблем, особенно если вы включаете одинаковые заголовки в исходные файлы обоих типов (в этом случае это необходимо) , Если у вас есть чисто C ++ проект, он может просто работать без проблем.GetTickCount
разрешение которой составляло 55 мс; более поздние версии имели разрешение 16 мс или меньше. Один пользователь думал, что он получал разрешение 16 мс от Sleep, но затем сообщил, чтоSleep
сам по себе он был довольно точным, и очевидная неточность была вызвана использованиемGetTickCount
измерения времени.Ответы:
Обратите внимание, что стандартного C API для миллисекунд не существует, поэтому (в Unix) вам придется согласиться
usleep
, что принимает микросекунды:источник
usleep
для этого?nanosleep
может быть лучшим выбором, посколькуusleep
оно устарело.В C ++ 11 вы можете сделать это с помощью стандартных библиотек:
Понятно и читабельно, больше не нужно угадывать, в каких единицах
sleep()
принимает функция.источник
sleep_for
для этого?Чтобы оставаться портативным, вы можете использовать Boost :: Thread для сна:
Этот ответ является дубликатом и был опубликован в этом вопросе ранее. Возможно, вы могли бы найти некоторые полезные ответы там тоже.
источник
boost::this_thread::sleep
добавляет точку прерывания в ваш код. boost.org/doc/libs/1_49_0/doc/html/thread/…В Unix вы можете использовать usleep .
В винде есть Sleep .
источник
В зависимости от вашей платформы вы можете иметь
usleep
илиnanosleep
доступны.usleep
устарела и была удалена из самого последнего стандарта POSIX;nanosleep
является предпочтительным.источник
usleep()
объявляется в<unistd.h>
, сбивает с толку,nanosleep()
объявляется в<time.h>
/<ctime>
.Почему бы не использовать библиотеку time.h? Работает в системах Windows и POSIX:
Исправленный код - теперь процессор остается в состоянии IDLE [2014.05.24]:
источник
#ifdef WIN32
не оценивается как true по умолчанию.#ifdef _WIN32
.nanosleep
это лучший выбор, чемusleep
- он более устойчив к прерываниям.источник
usleep
, но нетnanosleep
. Вы должны предоставить пример использования его в Linux.Синтаксис:
Применение:
источник
#include <WinBase.h>
#include <windows.h>
Если вы используете MS Visual C ++ 10.0, вы можете сделать это с помощью стандартных библиотек:
тебе понадобится:
источник
<concrt.h>
это не заголовок Стандартная библиотека - это может быть библиотека платформы; в этом случае вы должны четко сформулировать предпосылки.На платформах с этой
select
функцией (POSIX, Linux и Windows) вы можете сделать:Однако в настоящее время есть лучшие альтернативы.
источник
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.Способ сна вашей программы на C ++ - это
Sleep(int)
метод. Заголовочный файл для него#include "windows.h."
Например:
Время, в течение которого он спит, измеряется в миллисекундах и не имеет ограничений.
источник
Вызов select - способ повысить точность (время ожидания может быть указано в наносекундах).
источник
Используйте Boost асинхронные потоки ввода / вывода, спите в течение x миллисекунд;
источник
Вопрос старый, но мне удалось найти простой способ добавить это в мое приложение. Вы можете создать макрос C / C ++, как показано ниже, используя его:
источник
Из C ++ 14 с использованием std, а также его числовых литералов:
источник
В качестве замены Win32 для систем POSIX:
источник
nanosleep()
чтобыusleep()
: последний устарел и был удален из самого последнего стандарта POSIX.