Agregar retardo cronometrado en C++

Muhammad Husnain 12 octubre 2023
  1. Utilice la llamada al sistema sleep() para agregar un retraso cronometrado en C++
  2. Use la función usleep() para agregar un retraso cronometrado en C++
  3. Use la función sleep_for() para agregar un retraso cronometrado en C++
  4. Use la función sleep_until() para agregar un retraso cronometrado en C++
Agregar retardo cronometrado en C++

Este tutorial le brindará una breve guía sobre cómo agregar un retraso cronometrado en su programa C++.

Esto se puede hacer de muchas maneras utilizando algunas funciones que nos proporcionan las bibliotecas de C++. Discutiremos algunas funciones junto con su demostración de trabajo.

Cualquier proceso, tarea o subproceso en un programa de computadora puede suspenderse o volverse inactivo. Esto significa que la ejecución del proceso se puede poner en espera durante el tiempo que esté en suspensión.

Cuando el intervalo de suspensión expira o una señal o interrupción hace que la ejecución se reanude, la ejecución se reanudará. Existen diferentes métodos para este fin:

  1. la llamada al sistema sleep()
  2. el método usleep()
  3. el método sleep_for()
  4. el método sleep_until()

Utilice la llamada al sistema sleep() para agregar un retraso cronometrado en C++

Una llamada al sistema sleep puede poner un programa (tarea, proceso o subproceso) en suspensión. El parámetro time en una típica llamada al sistema sleep indica cuánto tiempo necesita el programa para dormir o permanecer inactivo.

El lenguaje C++ no tiene una función sleep. Esta funcionalidad la proporcionan archivos específicos del sistema operativo, como unistd.h para Linux y Windows.h para Windows.

Para utilizar la función sleep() en un sistema operativo Linux o UNIX, debemos incluir el archivo de cabecera "unistd.h" en nuestro programa.

Prototipo de función

unsigned sleep(unsigned seconds);

Toma una cantidad de parámetros de segundos por los cuales necesitamos suspender la ejecución y devuelve 0 si regresa con éxito a la ejecución. Si el sueño se interrumpe en el medio, se devuelve el tiempo total menos el tiempo de interrupción.

Ejemplo:

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  cout << "Before sleep call " << endl;
  cout.flush();
  sleep(9);
  cout << "After sleep call" << endl;

  return 0;
}

Producción :

Before sleep call
After sleep call

En la salida, hemos impreso dos declaraciones. Después de imprimir el primero, el compilador espera 9 segundos y luego se imprime el otro. Los lectores deben ejecutar el programa para observar este retraso.

Use la función usleep() para agregar un retraso cronometrado en C++

Otra función en el encabezado unistd.h es usleep(), que le permite pausar la ejecución de un programa durante un tiempo determinado. El funcionamiento es idéntico a la función sleep() descrita anteriormente.

La función usleep() suspende la ejecución del subproceso que llama durante usegundos microsegundos o hasta que se envía la señal que interrumpe la ejecución.

Prototipo de función

int usleep(useconds_t useconds);

Esta función toma como parámetro el número de microsegundos por los que se necesita pausar la ejecución y devuelve 0 si se reanuda con éxito y -1 si se produce algún fallo.

Ejemplo:

#include <unistd.h>

#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  cout << "Hello ";
  cout.flush();
  usleep(10000);
  cout << "World";
  cout << endl;

  return 0;
}

Producción :

Before Usleep Call
After Usleep call

Como puede ver en el fragmento de código anterior, proporcionamos una espera de 10000 microsegundos entre la impresión de dos declaraciones.

En C++ 11, contamos con funciones específicas para hacer que los subprocesos estén inactivos. Hay dos métodos para este propósito, sleep_for y sleep_until.

Analicemos estos dos métodos:

Use la función sleep_for() para agregar un retraso cronometrado en C++

La función sleep_for () se define en el encabezado <thread>. La función sleep_for () suspende la ejecución del hilo actual por la duración especificada en la duración del sueño.

Debido a actividades de programación o retrasos en la contención de recursos, esta función puede bloquearse por más tiempo que el período proporcionado.

Prototipo de función

template <class Rep, class Period>
void sleep_for(const std::chrono::duration<Rep, Period>& sleep_duration);

Ejemplo:

#include <chrono>
#include <iostream>
#include <thread>
using namespace std;

int main() {
  cout << "Hello I'm here before waiting" << endl;
  this_thread::sleep_for(chrono::milliseconds(10000));
  cout << "I Waited for 10000 ms\n";
}

Producción :

Hello I'm here before waiting
I Waited for 10000 ms

En el fragmento de código anterior, hemos hecho que el subproceso principal duerma durante 10000 milisegundos, lo que significa que el subproceso actual bloqueará 10000 milisegundos y luego reanudará su ejecución.

Use la función sleep_until() para agregar un retraso cronometrado en C++

El encabezado <thread> define esta función. El método sleep_until () detiene la ejecución de un subproceso hasta que haya pasado el tiempo de suspensión.

Debido a actividades de programación o retrasos en la contención de recursos, esta función, como las demás, puede bloquearse durante más tiempo que el especificado.

Prototipo de función

template <class Clock, class Duration>
void sleep_until(const std::chrono::time_point<Clock, Duration>& sleep_time);

Toma como parámetro el tiempo durante el cual se debe bloquear el hilo y no devuelve nada.

Ejemplo:

#include <chrono>
#include <iostream>
#include <thread>
using namespace std;

int main() {
  cout << "Hello I'm here before waiting" << endl;
  std::this_thread::sleep_until(std::chrono::system_clock::now()
                                    std::chrono::seconds(3));
  cout << "I Waited for 3 seconds\n";
}

Producción :

Hello I'm here before waiting
I Waited for 2 seconds
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn