Comment dormir pendant des millisecondes en C++
-
Utilisez
std::this_thread::sleep_for
Méthode pour dormir en C++ -
Utiliser la fonction
usleep
pour dormir en C++ -
Utiliser la fonction
nanosleep
pour dormir 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
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;
}
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