Wie man in C++ für Millisekunden schlafen kann

Jinku Hu 15 Februar 2024
  1. Verwendung von die Methode std::this_thread::sleep_for zum Einschlafen in C++
  2. Verwendung von die Funktion usleep zum Einschlafen in C++
  3. Verwendung von die Funktion nanosleep zum Einschlafen in C++
Wie man in C++ für Millisekunden schlafen kann

Dieser Artikel stellt Methoden zum Schlafen für Millisekunden in C++ vor.

Verwendung von die Methode std::this_thread::sleep_for zum Einschlafen in C++

Diese Methode ist eine reine C++-Version der sleep-Funktion aus der <thread>-Bibliothek, und es ist die portable Version sowohl für Windows- als auch für Unix-Plattformen. Um ein besseres Beispiel zu demonstrieren, unterbrechen wir den Prozess für 3000 Millisekunden.

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

Ausgabe:

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

wie man in Cpp schlafen kann

Wir können den obigen Code mit einer eloquenteren Version umschreiben, indem wir den Namensraum std::chrono_literals verwenden:

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

Verwendung von die Funktion usleep zum Einschlafen in C++

usleep ist eine POSIX-spezifische Funktion, die im Header <unistd.h> definiert ist, die die Anzahl von Mikrosekunden als Argument akzeptiert, die vom Typ vorzeichenlose Ganzzahl sein sollte und in der Lage ist, Ganzzahlen im Bereich [0,1000000] zu halten.

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

Alternativ können wir ein benutzerdefiniertes Makro mit der Funktion usleep definieren und einen wiederverwendbaren Codeschnipsel erstellen.

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

Verwendung von die Funktion nanosleep zum Einschlafen in C++

Die nanosleep-Funktion ist eine weitere POSIX-spezifische Version, die eine bessere Behandlung von Interrupts bietet und eine feinere Auflösung des Schlafintervalls hat. Nämlich erzeugt ein Programmierer eine Timespec-Struktur, um die Anzahl der Sekunden und Nanosekunden getrennt anzugeben. Nanosleep nimmt auch den zweiten Strukturparameter timespec, um das verbleibende Zeitintervall zurückzugeben, falls das Programm durch ein Signal unterbrochen wird. Beachten Sie, dass der Programmierer für die Behandlung von Unterbrechungen verantwortlich ist.

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