Como dormir durante milissegundos em C++

Jinku Hu 15 fevereiro 2024
  1. Utilize std::this_thread::sleep_for Método para dormir em C++
  2. Utilize a função usleep para dormir em C++
  3. Utilize a função nanosleep para Dormir em C++
Como dormir durante milissegundos 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

como dormir em Cpp

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