Sospendi per millisecondi in C++

Jinku Hu 12 ottobre 2023
  1. Usa il metodo std::this_thread::sleep_for per dormire in C++
  2. Usa la funzione usleep per dormire in C++
  3. Usa la funzione nanosleep per dormire in C++
Sospendi per millisecondi in C++

Questo articolo introduce i metodi per dormire per millisecondi in C++.

Usa il metodo std::this_thread::sleep_for per dormire in C++

Questo metodo è una versione C++ pura della funzione sleep della libreria <thread>, ed è la versione portabile sia per piattaforme Windows che Unix. Per una migliore dimostrazione di esempio, sospendiamo il processo per 3000 millisecondi.

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

Produzione:

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

come dormire in Cpp

Possiamo riscrivere il codice sopra con una versione più eloquente usando lo spazio dei nomi 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;
}

Usa la funzione usleep per dormire in C++

usleep è una funzione specifica POSIX definita nell’intestazione <unistd.h>, che accetta il numero di microsecondi come argomento, che dovrebbe essere di tipo intero senza segno ed è in grado di contenere numeri interi nell’intervallo [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;
}

In alternativa, possiamo definire una macro personalizzata utilizzando la funzione usleep e creare uno snippet di codice più riutilizzabile.

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

Usa la funzione nanosleep per dormire in C++

La funzione nanosleep è un’altra versione specifica di POSIX che offre una migliore gestione degli interrupt e ha una risoluzione più fine dell’intervallo di sonno. Vale a dire, un programmatore crea una struttura timespec per specificare separatamente il numero di secondi e nanosecondi. nanosleep accetta anche il secondo parametro struct timespec per restituire l’intervallo di tempo rimanente nel caso in cui il programma venga interrotto da un segnale. Notare che il programmatore è responsabile della gestione degli interrupt.

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