Comment dormir pendant des millisecondes en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::this_thread::sleep_for Méthode pour dormir en C++
  2. Utiliser la fonction usleep pour dormir en C++
  3. Utiliser la fonction nanosleep pour dormir en C++
Comment dormir pendant des millisecondes en C++

Cet article présente des méthodes pour dormir pendant des millisecondes en C++.

Utilisez std::this_thread::sleep_for Méthode pour dormir en C++

Cette méthode est une version purement C++ de la fonction sleep de la bibliothèque <thread>, et c’est la version portable pour les plates-formes Windows et Unix. Pour un meilleur exemple de démonstration, nous suspendons le processus pendant 3000 millisecondes.

#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;
}

Production:

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

comment dormir en Cpp

Nous pouvons réécrire le code ci-dessus avec une version plus éloquente en utilisant l’espace de noms 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;
}

Utiliser la fonction usleep pour dormir en C++

La fonction usleep est une fonction spécifique POSIX définie dans l’en-tête <unistd.h>, qui accepte le nombre de microsecondes comme argument, qui doit être de type entier non signé et est capable de contenir des entiers dans la plage [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;
}

Alternativement, nous pouvons définir une macro personnalisée en utilisant la fonction usleep et faire un extrait de code plus réutilisable.

#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;
}

Utiliser la fonction nanosleep pour dormir en C++

La fonction nanosleep est une autre version spécifique à POSIX qui offre une meilleure gestion des interruptions et une résolution plus fine de l’intervalle de sommeil. En effet, un programmeur crée une structure timespec pour spécifier le nombre de secondes et de nanosecondes séparément. Le paramètre nanosleep prend également le second paramètre de la structure timespec pour renvoyer l’intervalle de temps restant au cas où le programme serait interrompu par un signal. Notez que le programmeur est responsable de la gestion des interruptions.

#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;
}
Auteur: 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