Le temps, c'est de l'argent : comment endormir un thread en C++ pour des millisecondes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Quand chaque milliseconde compte : pourquoi un sommeil précis en C++ est nécessaire

\n\n

Imaginez que vous écrivez un jeu où les ennemis attaquent toutes les 500 ms. Ou que vous développez un contrôleur industriel qui interroge un capteur strictement toutes les 10 ms. Ou que vous voulez simplement créer une animation de chargement avec une apparition progressive du texte. Dans tous ces cas, vous aurez besoin de la commande : sleep for milliseconds.

\n\n

Il semblerait que ce soit simple — « endormir » un thread pendant un temps donné ? Mais en C++, contrairement à Python ou JavaScript, il n'existe pas de fonction intégrée unique « attends N millisecondes ». Plus précisément, elle existe, mais elle est différente selon les systèmes d'exploitation et les normes. Et il y a aussi des pièges : précision, portabilité, impact sur les performances.

\n\n

Dans cet article, nous allons passer en revue toutes les méthodes pour créer un délai en C++ en millisecondes : des bonnes vieilles Sleep() et usleep() jusqu'au moderne std::this_thread::sleep_for(). Vous obtiendrez des exemples de code prêts à l'emploi, apprendrez quelle méthode choisir pour votre tâche, et saurez éviter les erreurs typiques.

\n\n

Méthode standard : std::this_thread::sleep_for (C++11 et versions ultérieures)

\n\n

Depuis la norme C++11, la bibliothèque <chrono> et la possibilité de délai portable de thread sont apparues dans le langage. C'est la méthode la plus correcte et recommandée pour le code C++ moderne.

\n\n

Comment ça fonctionne

\n\n

La fonction std::this_thread::sleep_for() prend un intervalle de temps, spécifié à l'aide de std::chrono::duration. Vous indiquez simplement le nombre de millisecondes, et le thread « s'endort » pendant ce temps.

\n\n

Exemple 1 : Délai de base de 500 ms

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nint main() {\n    std::cout << "Début du compte à rebours...\\n";\n    \n    // Délai de 500 millisecondes\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    \n    std::cout << "Une demi-seconde s'est écoulée !\\n";\n    return 0;\n}
\n\n

Ce code fonctionnera sur Windows, Linux, macOS et toute autre plateforme avec un compilateur C++11/14/17/20. Pas de #ifdef, pas d'appels système.

\n\n

Exemple 2 : Délai avec variable

\n\n

Si vous devez définir le temps dynamiquement :

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nvoid process_with_delay(int delay_ms) {\n    std::cout << "Traitement avec un délai de " << delay_ms << " ms...\\n";\n    std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));\n    std::cout << "Terminé !\\n";\n}\n\nint main() {\n    process_with_delay(200);\n    process_with_delay(1000);\n    return 0;\n}
\n\n

Important : précision de sleep_for

\n\n

La fonction sleep_for() ne garantit pas une précision absolue à la microseconde près. Le temps de réveil réel peut être légèrement plus long (de quelques millisecondes) en raison de l'ordonnanceur du système d'exploitation. Pour la plupart des tâches (animations, timeouts, interrogation de capteurs), cela suffit. Si vous avez besoin d'une précision à la microseconde, consultez la section « Quand la précision est critique ».

\n\n

Méthode classique : Sleep() pour Windows

\n\n

Si vous écrivez du code uniquement pour Windows (par exemple, un ancien projet sur Visual Studio), vous pouvez utiliser la fonction Sleep() de l'API Windows. Elle « dort » précisément en millisecondes.

\n\n

Exemple 3 : Délai de 1 seconde sous Windows

\n\n
#include <iostream>\n#include <windows.h> // Obligatoire à inclure\n\nint main() {\n    std::cout << "Attente de 1 seconde (Windows)...\\n";\n    Sleep(1000); // Argument en millisecondes\n    std::cout << "Réveillé !\\n";\n    return 0;\n}
\n\n

Inconvénients :

\n