Cómo dormir durante milisegundos en C++
-
Usa
std::this_thread::sleep_for
el método para dormir en C++ -
Usar la función
usleep
para dormir en C++ -
Usar la función
nanosleep
para dormir 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
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;
}
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