Сон на миллисекунды
Я знаю, что функция POSIX sleep(x)
заставляет программу засыпать на x секунд. Есть ли функция, которая позволяет заставить программу засыпать на x миллисекунд в C++?
5 ответ(ов)
В C++11 вы можете сделать это, используя стандартные библиотеки:
#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));
Это понятно и наглядно, больше не нужно догадываться, в каких единицах принимает аргумент функция sleep()
.
Обратите внимание, что в стандартном C API нет функции для работы с миллисекундами, поэтому (в Unix) вам придется использовать usleep
, которая принимает значение в микросекундах:
#include <unistd.h>
unsigned int microseconds;
...
usleep(microseconds);
Если вам нужно задать задержку в миллисекундах, просто умножьте желаемое количество миллисекунд на 1000, чтобы перевести его в микросекунды:
unsigned int milliseconds = 100; // задержка в миллисекундах
unsigned int microseconds = milliseconds * 1000; // перевод в микросекунды
usleep(microseconds);
Таким образом, вы можете использовать usleep
для достижения желаемой задержки, но не забудьте, что точность задержки будет зависеть от системы и текущей нагрузки.
В C++14 можно использовать стандартные литералы времени и функционал, предоставляемый заголовочными файлами <chrono>
и <thread>
, для работы с задержками. Вот как можно реализовать паузу в 123 миллисекунды:
#include <chrono>
#include <thread>
using namespace std::chrono_literals;
std::this_thread::sleep_for(123ms);
В этом примере мы подключаем необходимые заголовочные файлы, а затем используем std::this_thread::sleep_for
, чтобы приостановить выполнение текущего потока на 123 миллисекунды. С помощью директивы using namespace std::chrono_literals;
мы можем использовать суффикс ms
для представления миллисекунд, что делает код более читаемым и удобным.
В зависимости от вашей платформы, возможно, у вас есть функции usleep
или nanosleep
. Однако стоит отметить, что usleep
устарела и была исключена из последнего стандарта POSIX; предпочтительнее использовать nanosleep
.
Вы не должны использовать библиотеку time.h
? Давайте рассмотрим приведенный пример кода, который позволяет приостановить выполнение программы с использованием функции sleepcp
и позволяет это делать на системах Windows и POSIX. Однако – будьте осторожны! Этот код не рекомендуется для использования в производственной среде.
Вот код:
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif // _WIN32
using namespace std;
void sleepcp(int milliseconds);
void sleepcp(int milliseconds) // Кросс-платформенная функция для "сна"
{
#ifdef _WIN32
Sleep(milliseconds);
#else
usleep(milliseconds * 1000);
#endif // _WIN32
}
int main()
{
cout << "Привет! На счет до 3 я умру! :)" << endl;
sleepcp(3000);
cout << "урррргггггг!" << endl;
}
Почему не использовать time.h
?
Портативность: Хотя
time.h
предоставляет некоторые функции для работы со временем, в данном случае использование Windows API (Sleep
) и POSIX (usleep
) позволяет добиться большей единообразия в поведении между платформами.Проблемы с точностью: Функции из
time.h
могут не обеспечить необходимую точность в определенных сценариях. Например, использованиеsleep()
может зависеть от системного времени и других факторов.Неэффективность: Если вам нужно просто замедлить выполнение кода, использование
sleepcp
более эффективно, так как это явно определяется в зависимости от операционной системы, минимизируя накладные расходы.
Важно!
Хотя предоставленный код работает на Windows и POSIX-системах, он не должен использоваться в производственных проектах. Инструкции для паузы могут варьироваться в зависимости от требуемой точности и контекста, в котором они используются.
Как изменить цвет вывода echo в Linux
Что такое Правило трёх?
Разница между const int*, const int * const и int * const?
В чём разница между g++ и gcc?
Имеют ли круглые скобки после имени типа значение при использовании new?