Sospendi per millisecondi in C++
-
Usa il metodo
std::this_thread::sleep_for
per dormire in C++ -
Usa la funzione
usleep
per dormire in C++ -
Usa la funzione
nanosleep
per dormire 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
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;
}
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