Como dormir durante milissegundos em C++
-
Utilize
std::this_thread::sleep_for
Método para dormir em C++ -
Utilize a função
usleep
para dormir em C++ -
Utilize a função
nanosleep
para Dormir em C++
Este artigo introduz métodos para dormir durante milissegundos em C++.
Utilize std::this_thread::sleep_for
Método para dormir em C++
Este método é uma versão C++ pura da função sono
da biblioteca <thread>
, e é a versão portátil para plataformas Windows e Unix. Para um melhor exemplo de demonstração, estamos suspendendo o processo por 3000 milissegundos.
#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;
}
Resultado:
Started loop... Iteration - 0 Iteration - 1 Iteration - 2 Iteration -
3 Iteration - 4 Sleeping....Iteration - 5 Iteration - 6 Iteration -
7 Iteration - 8 Iteration - 9
Podemos reescrever o código acima com uma versão mais eloqüente utilizando o espaço de nomes 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;
}
Utilize a função usleep
para dormir em C++
O usleep
é uma função específica do POSIX definida no cabeçalho <unistd.h>
, que aceita como argumento o número de microssegundos, que deve ser do tipo inteiro não assinado e é capaz de manter inteiros na faixa [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;
}
Alternativamente, podemos definir uma macro personalizada utilizando a função usleep
e fazer um trecho de código mais reutilizável.
#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;
}
Utilize a função nanosleep
para Dormir em C++
A função nanosleep
é outra versão específica do POSIX que oferece melhor manuseio das interrupções e tem uma resolução mais fina do intervalo de sono. Nomeadamente, um programador cria uma estrutura timespec
para especificar o número de segundos e nanossegundos separadamente. O nanosleep
também leva o segundo parâmetro de estrutura timespec
para retornar o intervalo de tempo restante, caso o programa seja interrompido por um sinal. Note que o programador é responsável pelo tratamento da interrupção.
#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