HOWTO · 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++.

En esta página

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