8

Сон на миллисекунды

10

Я знаю, что функция POSIX sleep(x) заставляет программу засыпать на x секунд. Есть ли функция, которая позволяет заставить программу засыпать на x миллисекунд в C++?

5 ответ(ов)

17

В C++11 вы можете сделать это, используя стандартные библиотеки:

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));

Это понятно и наглядно, больше не нужно догадываться, в каких единицах принимает аргумент функция sleep().

5

Обратите внимание, что в стандартном 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 для достижения желаемой задержки, но не забудьте, что точность задержки будет зависеть от системы и текущей нагрузки.

0

В 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 для представления миллисекунд, что делает код более читаемым и удобным.

0

В зависимости от вашей платформы, возможно, у вас есть функции usleep или nanosleep. Однако стоит отметить, что usleep устарела и была исключена из последнего стандарта POSIX; предпочтительнее использовать nanosleep.

0

Вы не должны использовать библиотеку 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?

  1. Портативность: Хотя time.h предоставляет некоторые функции для работы со временем, в данном случае использование Windows API (Sleep) и POSIX (usleep) позволяет добиться большей единообразия в поведении между платформами.

  2. Проблемы с точностью: Функции из time.h могут не обеспечить необходимую точность в определенных сценариях. Например, использование sleep() может зависеть от системного времени и других факторов.

  3. Неэффективность: Если вам нужно просто замедлить выполнение кода, использование sleepcp более эффективно, так как это явно определяется в зависимости от операционной системы, минимизируя накладные расходы.

Важно!

Хотя предоставленный код работает на Windows и POSIX-системах, он не должен использоваться в производственных проектах. Инструкции для паузы могут варьироваться в зависимости от требуемой точности и контекста, в котором они используются.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь