Cómo dormir durante milisegundos en C++

Jinku Hu 12 octubre 2023
  1. Usa std::this_thread::sleep_for el método para dormir en C++
  2. Usar la función usleep para dormir en C++
  3. Usar la función nanosleep para dormir en C++
Cómo dormir durante milisegundos en C++

Este artículo introduce métodos para dormir durante milisegundos en C++.

Usa std::this_thread::sleep_for el método para dormir en C++

Este método es una versión pura de C++ de la función sleep de la biblioteca <thread>, y es la versión portátil tanto para plataformas Windows como Unix. Para una mejor demostración de ejemplo, estamos suspendiendo el proceso por 3000 milisegundos.

#include <chrono>
#include <iostream>
#include <thread>

using std::cin;
using std::cout;
using std::endl;
using std::this_thread::sleep_for;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      sleep_for(std::chrono::milliseconds(TIME_TO_SLEEP));
    }
  }
  return 0;
}

Resultado:

Started loop... Iteration - 0 Iteration - 1 Iteration - 2 Iteration -
    3 Iteration - 4 Sleeping....Iteration - 5 Iteration - 6 Iteration -
    7 Iteration - 8 Iteration - 9

cómo dormir en Cpp

Podemos reescribir el código anterior con una versión más elocuente usando el espacio de nombres std::chrono_literals:

#include <iostream>
#include <thread>

using std::cin;
using std::cout;
using std::endl;
using std::this_thread::sleep_for;
using namespace std::chrono_literals;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      sleep_for(3000ms);
    }
  }
  return 0;
}

Usar la función usleep para dormir en C++

usleep es una función específica de POSIX definida en la cabecera <unistd.h>, que acepta el número de microsegundos como argumento, que debe ser de tipo entero sin signo y es capaz de contener números enteros en el rango [0,1000000].

#include <unistd.h>

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      usleep(TIME_TO_SLEEP * 1000);
      ;
    }
  }
  return 0;
}

Alternativamente, podemos definir una macro personalizada usando la función usleep y hacer un fragmento de código más reutilizable.

#include <unistd.h>

#include <iostream>

#define SLEEP_MS(milsec) usleep(milsec * 1000)

using std::cin;
using std::cout;
using std::endl;

constexpr int TIME_TO_SLEEP = 3000;

int main() {
  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;

    if (i == 4) {
      cout << "Sleeping ...." << endl;
      SLEEP_MS(TIME_TO_SLEEP);
    }
  }
  return 0;
}

Usar la función nanosleep para dormir en C++

La función nanosleep es otra versión específica de POSIX que ofrece un mejor manejo de las interrupciones y tiene una resolución más fina del intervalo de sueño. Es decir, un programador crea una estructura de timespec para especificar el número de segundos y nanosegundos por separado. nanosleep también toma el segundo parámetro de la estructura timespec para devolver el intervalo de tiempo restante en caso de que el programa sea interrumpido por una señal. Tenga en cuenta que el programador es responsable del manejo de las interrupciones.

#include <ctime>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

constexpr int SECS_TO_SLEEP = 3;
constexpr int NSEC_TO_SLEEP = 3;

int main() {
  struct timespec request {
    SECS_TO_SLEEP, NSEC_TO_SLEEP
  }, remaining{SECS_TO_SLEEP, NSEC_TO_SLEEP};

  cout << "Started loop.." << endl;
  for (int i = 0; i < 10; ++i) {
    cout << "Iteration - " << i << endl;
    if (i == 4) {
      cout << "Sleeping ...." << endl;
      nanosleep(&request, &remaining);
    }
  }
  return 0;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook