Zeit ist Geld: So versetzen Sie einen Thread in C++ für Millisekunden in den Schlaf

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wenn jede Millisekunde zählt: Warum präziser Schlaf in C++ wichtig ist

\n\n

Stellen Sie sich vor, Sie programmieren ein Spiel, in dem Feinde alle 500 ms angreifen. Oder Sie entwickeln eine industrielle Steuerung, die einen Sensor streng alle 10 ms abfragt. Oder Sie möchten einfach eine Ladeanimation mit sanft erscheinendem Text erstellen. In all diesen Fällen benötigen Sie den Befehl: sleep for milliseconds.

\n\n

Es scheint einfach, einen Thread für eine bestimmte Zeit „schlafen“ zu legen. Aber in C++ gibt es, anders als in Python oder JavaScript, keine einzige integrierte Funktion „warte N Millisekunden“. Genauer gesagt, gibt es sie, aber in verschiedenen Betriebssystemen und Standards gibt es unterschiedliche. Und es gibt Fallstricke: Genauigkeit, Portabilität, Auswirkungen auf die Leistung.

\n\n

In diesem Artikel analysieren wir alle Methoden, um eine Verzögerung in C++ für Millisekunden zu erzeugen: von den altbewährten Sleep() und usleep() bis zum modernen std::this_thread::sleep_for(). Sie erhalten fertige Codebeispiele, erfahren, welche Methode Sie für Ihre Aufgabe wählen sollten, und lernen, typische Fehler zu vermeiden.

\n\n

Die Standardmethode: std::this_thread::sleep_for (C++11 und neuer)

\n\n

Ab dem Standard C++11 enthält die Sprache die Bibliothek <chrono> und die Möglichkeit einer portablen Thread-Verzögerung. Dies ist die korrekteste und empfohlene Methode für modernen C++-Code.

\n\n

Wie es funktioniert

\n\n

Die Funktion std::this_thread::sleep_for() akzeptiert ein Zeitintervall, das mit std::chrono::duration angegeben wird. Sie geben einfach die Anzahl der Millisekunden an, und der Thread „schläft“ für diese Zeit.

\n\n

Beispiel 1: Basisverzögerung von 500 ms

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nint main() {\n    std::cout << "Countdown startet...\\n";\n    \n    // Verzögerung von 500 Millisekunden\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    \n    std::cout << "Eine halbe Sekunde ist vergangen!\\n";\n    return 0;\n}
\n\n

Dieser Code funktioniert unter Windows, Linux, macOS und jeder anderen Plattform mit einem C++11/14/17/20 Compiler. Kein #ifdef, keine Systemaufrufe.

\n\n

Beispiel 2: Verzögerung mit einer Variable

\n\n

Falls Sie die Zeit dynamisch festlegen müssen:

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nvoid process_with_delay(int delay_ms) {\n    std::cout << "Verarbeitung mit Verzögerung " << delay_ms << " ms...\\n";\n    std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));\n    std::cout << "Fertig!\\n";\n}\n\nint main() {\n    process_with_delay(200);\n    process_with_delay(1000);\n    return 0;\n}
\n\n

Wichtig: Genauigkeit von sleep_for

\n\n

Die Funktion sleep_for() garantiert keine absolute Genauigkeit bis auf Mikrosekunden. Die tatsächliche Aufwachzeit kann aufgrund des Betriebssystem-Schedulers etwas länger sein (um einige Millisekunden). Für die meisten Aufgaben (Animationen, Timeouts, Sensorabfragen) ist dies ausreichend. Wenn Sie jedoch eine mikroskopische Genauigkeit benötigen, lesen Sie den Abschnitt „Wenn Genauigkeit kritisch ist“.

\n\n

Die klassische Methode: Sleep() für Windows

\n\n

Wenn Sie Code nur für Windows schreiben (z. B. ein altes Projekt in Visual Studio), können Sie die Funktion Sleep() aus der Windows-API verwenden. Sie „schläft“ genau in Millisekunden.

\n\n

Beispiel 3: Verzögerung von 1 Sekunde unter Windows

\n\n
#include <iostream>\n#include <windows.h> // Muss eingebunden werden\n\nint main() {\n    std::cout << "Warte 1 Sekunde (Windows)...\\n";\n    Sleep(1000); // Argument in Millisekunden\n    std::cout << "Aufgewacht!\\n";\n    return 0;\n}
\n\n

Nachteile:

\n