Quand chaque milliseconde compte : pourquoi un sommeil précis en C++ est nécessaire
\n\nImaginez 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.
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\nDans 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.
Méthode standard : std::this_thread::sleep_for (C++11 et versions ultérieures)
\n\nDepuis 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.
Comment ça fonctionne
\n\nLa 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.
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\nCe 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\nExemple 2 : Délai avec variable
\n\nSi 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\nImportant : précision de sleep_for
\n\nLa 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 ».
Méthode classique : Sleep() pour Windows
\n\nSi 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.
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\nInconvénients :
\n- \n
- Ne fonctionne pas sur Linux/macOS. \n
- Nécessite l'inclusion de
<windows.h>, ce qui peut provoquer des conflits de noms. \n