Как добавить задержку по времени в программу на C ++?

94

Я пытаюсь добавить задержку по времени в программу на C ++, и мне было интересно, есть ли у кого-нибудь предложения о том, что я могу попробовать, или информацию, которую я могу посмотреть?

Мне жаль, что у меня не было более подробной информации о том, как я реализую эту временную задержку, но пока у меня не будет дополнительной информации о том, как добавить временную задержку, я не уверен, как мне даже попытаться реализовать это.

Мэтт Паско
источник
2
Это зависит от того, какая платформа (ОС) и какие библиотеки у вас есть.
Скотт Лэнгем,

Ответы:

79

Win32: Sleep(milliseconds)это то, что ты, что

unix: usleep(microseconds)это то, что вы хотите.

sleep () занимает всего несколько секунд, что часто бывает слишком долго.

Ричард Харрисон
источник
3
Также есть nanosleep (), если usleep () не дает вам достаточного разрешения.
Кристофер Джонсон,
9
Имейте в виду, что аргументом этих функций является МИНИМАЛЬНОЕ время ожидания, и НЕ гарантируется, что вы вернетесь сразу же, если в это время другой процесс загружает процессор.
billjamesdev 01
1
@ Ричард Харрисон: Какой заголовок я должен включить, чтобы sleep () работал?
Overflowh
12
@Overflowh в win32 Sleep () находится в windows.h; в unix sleep () в unistd.h
Ричард Харрисон,
1
@TommasoTheaCioni Хорошо, я полагаю, вы имеете в виду: «Как мне заставить программу перезапускаться точно с задержкой?», И ответ ... вы не можете. Вы не контролируете операционную систему до такой степени. Если какая-то другая программа находится в середине какого-то критического сегмента, ваша программа просто должна подождать.
billjamesdev
138

Обновленный ответ для C ++ 11:

Используйте sleep_forи sleep_untilфункции:

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread; // sleep_for, sleep_until
    using namespace std::chrono; // nanoseconds, system_clock, seconds

    sleep_for(nanoseconds(10));
    sleep_until(system_clock::now() + seconds(1));
}

Не С помощью этих функций больше нет необходимости постоянно добавлять новые функции для лучшего разрешения: sleep, usleep, nanosleepи т.д. , sleep_forи sleep_untilявляются функциями шаблонов , которые могут принимать значение любого разрешения по chronoтипам; часы, секунды, фемтосекунды и т. д.

В C ++ 14 вы можете еще больше упростить код с помощью буквальных суффиксов для nanosecondsи seconds:

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;

    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);
}

Обратите внимание, что фактическая продолжительность сна зависит от реализации: вы можете запросить сон на 10 наносекунд, но реализация может вместо этого спать на миллисекунду, если это самое короткое из возможных значений.

bames53
источник
4
Определяемые пользователем буквальные суффиксы. Они копали ... слишком глубоко.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
34
#include <unistd.h>
usleep(3000000);

Он также будет спать на три секунды. Однако вы можете уточнить числа еще немного.

Самир Талвар
источник
Спасибо! Простое и чистое решение. Работал над компиляцией Mac с помощью G ++ VS Code.
Z41N
18

Вы хотите что-то настолько простое, как

sleep(3);
JJ
источник
Должно. Практически универсален. На каком языке / компиляторе вы это пробовали? Вы импортировали все необходимые библиотеки?
JJ
4
Я не мог понять, почему он не был отмечен как ответ или получил мало голосов
ImranNaqvi
8

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

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

Клин
источник
4

Вы можете попробовать этот фрагмент кода:

#include<chrono>
#include<thread>

int main(){
    std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));
}
Джайеш Ратод
источник
3

Вы также можете использовать select (2), если вам нужна микросекундная точность (это работает на платформе, у которой нет usleep (3))

Следующий код будет ждать 1,5 секунды:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() {
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);
}

`

Матиас Броссар
источник
3

Да, сон, вероятно, является здесь предпочтительной функцией. Обратите внимание, что время, переданное функции, - это наименьшее время, в течение которого вызывающий поток будет неактивен. Так, например, если вы вызываете режим сна с 5 секундами, вам гарантируется, что ваш поток будет спать не менее 5 секунд. Может быть 6, 8 или 50, в зависимости от того, что делает ОС. (При оптимальном выполнении ОС это будет очень близко к 5.)
Еще одна полезная особенность функции сна - передать 0. Это вызовет переключение контекста из вашего потока.

Дополнительная информация:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

Марчин
источник
3

Я обнаружил, что "_sleep(milliseconds);"(без кавычек) хорошо работает для Win32, если вы включите chronoбиблиотеку

Например:

#include <chrono>

using namespace std;

main
{
    cout << "text" << endl;
    _sleep(10000); // pauses for 10 seconds
}

Убедитесь, что вы добавили подчеркивание перед сном.

ARoberts
источник
Эта функция была заменена новой библиотекой или функциональностью операционной системы. Вместо этого рассмотрите возможность использования сна.
ByWaleed
3

для задержки вывода в cpp на фиксированное время вы можете использовать функцию Sleep (), включив синтаксис файла заголовка windows.h для функции Sleep (): Sleep (time_in_ms) как

cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";

ВЫХОД. Приведенный выше код распечатает Apple и подождет 3 секунды перед печатью Mango.

Абхишек Ратор
источник
2

Главный ответ здесь, кажется, зависит от ОС; для более портативного решения вы можете написать функцию быстрого сна, используя файл заголовка ctime (хотя это может быть плохой реализацией с моей стороны).

#include <iostream>
#include <ctime>

using namespace std;

void sleep(float seconds){
    clock_t startClock = clock();
    float secondsAhead = seconds * CLOCKS_PER_SEC;
    // do nothing until the elapsed time has passed.
    while(clock() < startClock+secondsAhead);
    return;
}
int main(){

    cout << "Next string coming up in one second!" << endl;
    sleep(1.0);
    cout << "Hey, what did I miss?" << endl;

    return 0;
}
Милан Донхоув
источник
0

Синтаксис:

недействительный сон (беззнаковые секунды);

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

ГЕОЧЕТ
источник
0

Многие другие предоставили полезную информацию для сна. Я согласен с Веджем в том, что сон редко бывает самым подходящим решением.

Если вы спите, ожидая чего-то, тогда вам лучше на самом деле дождаться этого события / события. Посмотрите на переменные условия для этого.

Я не знаю, на какой ОС вы пытаетесь это сделать, но для потоковой передачи и синхронизации вы можете обратиться к библиотекам Boost Threading ( Boost Condition Varriable ).

Переходя к другой крайности, если вы пытаетесь выжидать исключительно короткие периоды времени, есть несколько вариантов стиля взлома. Если вы работаете на какой-то встроенной платформе, где «сон» не реализован, вы можете попробовать простой цикл (for / while и т. Д.) С пустым телом (будьте осторожны, компилятор не оптимизирует его). Конечно, в этом случае время ожидания зависит от конкретного оборудования. Для действительно коротких "ожиданий" вы можете попробовать сборку "nop". Я очень сомневаюсь, что это именно то, что вам нужно, но, не зная, почему вам нужно ждать, трудно быть более конкретным.


источник
0

В Windows вы можете включить библиотеку Windows и использовать "Sleep (0);" чтобы спать прогу. Он принимает значение, представляющее миллисекунды.

Зи Джолли Роджер
источник