Tiempo es dinero: cómo dormir un hilo en C++ por milisegundos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cuando cada milisegundo cuenta: por qué se necesita un sueño preciso en C++

\n\n

Imagine que está escribiendo un juego donde los enemigos atacan cada 500 ms. O está desarrollando un controlador industrial que consulta un sensor estrictamente cada 10 ms. O simplemente quiere hacer una animación de carga con una aparición suave del texto. En todos estos casos, necesitará el comando: sleep for milliseconds.

\n\n

Parecería sencillo: «dormir» un hilo durante un tiempo determinado. Pero en C++, a diferencia de Python o JavaScript, no existe una única función incorporada «espera N milisegundos». Más bien, existe, pero en diferentes sistemas operativos y estándares, cada uno tiene la suya. Y también hay trampas: precisión, portabilidad, impacto en el rendimiento.

\n\n

En este artículo, analizaremos todas las formas de hacer un retardo en C++ por milisegundos: desde los clásicos Sleep() y usleep() hasta el moderno std::this_thread::sleep_for(). Obtendrá ejemplos de código listos para usar, sabrá qué método elegir para su tarea y aprenderá a evitar errores típicos.

\n\n

Forma estándar: std::this_thread::sleep_for (C++11 y posteriores)

\n\n

A partir del estándar C++11, el lenguaje incorporó la biblioteca <chrono> y la capacidad de un retardo de hilo portátil. Este es el método más correcto y recomendado para código C++ moderno.

\n\n

Cómo funciona

\n\n

La función std::this_thread::sleep_for() acepta un intervalo de tiempo, especificado mediante std::chrono::duration. Simplemente indica la cantidad de milisegundos y el hilo se «duerme» durante ese tiempo.

\n\n

Ejemplo 1: Retardo básico de 500 ms

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nint main() {\n    std::cout << "Comenzando la cuenta atrás...\\n";\n    \n    // Retardo de 500 milisegundos\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    \n    std::cout << "¡Han pasado medio segundo!\\n";\n    return 0;\n}
\n\n

Este código funcionará en Windows, Linux, macOS y cualquier otra plataforma con un compilador C++11/14/17/20. Sin #ifdef, sin llamadas al sistema.

\n\n

Ejemplo 2: Retardo con variable

\n\n

Si necesita especificar el tiempo dinámicamente:

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nvoid process_with_delay(int delay_ms) {\n    std::cout << "Procesando con retardo de " << delay_ms << " ms...\\n";\n    std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));\n    std::cout << "¡Listo!\\n";\n}\n\nint main() {\n    process_with_delay(200);\n    process_with_delay(1000);\n    return 0;\n}
\n\n

Importante: precisión de sleep_for

\n\n

La función sleep_for() no garantiza una precisión absoluta hasta los microsegundos. El tiempo real de despertar puede ser ligeramente mayor (unos pocos milisegundos) debido al planificador del sistema operativo. Para la mayoría de las tareas (animaciones, tiempos de espera, consulta de sensores) esto es suficiente. Si necesita precisión de microsegundos, consulte la sección «Cuando la precisión es crítica».

\n\n

Forma clásica: Sleep() para Windows

\n\n

Si escribe código solo para Windows (por ejemplo, un proyecto antiguo en Visual Studio), puede usar la función Sleep() de la API de Windows. Esta «duerme» exactamente en milisegundos.

\n\n

Ejemplo 3: Retardo de 1 segundo en Windows

\n\n
#include <iostream>\n#include <windows.h> // Obligatorio incluir\n\nint main() {\n    std::cout << "Esperando 1 segundo (Windows)...\\n";\n    Sleep(1000); // Argumento en milisegundos\n    std::cout << "¡Despertamos!\\n";\n    return 0;\n}
\n\n

Desventajas:

\n