Tempo é dinheiro: como pausar uma thread em C++ por milissegundos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Quando cada milissegundo conta: por que você precisa de um sleep preciso em C++

\n\n

Imagine que você está escrevendo um jogo onde os inimigos atacam a cada 500 ms. Ou desenvolvendo um controlador industrial que consulta um sensor estritamente a cada 10 ms. Ou simplesmente quer fazer uma animação de carregamento com aparecimento suave de texto. Em todos esses casos, você precisará do comando: sleep for milliseconds.

\n\n

Parece simples — "pausar" uma thread por um tempo determinado? Mas em C++, ao contrário de Python ou JavaScript, não existe uma única função embutida "espere N milissegundos". Ou melhor, ela existe, mas em diferentes sistemas operacionais e padrões — cada um com a sua. E ainda há armadilhas: precisão, portabilidade, impacto no desempenho.

\n\n

Neste artigo, vamos abordar todas as formas de fazer uma pausa em C++ por milissegundos: desde os clássicos Sleep() e usleep() até o moderno std::this_thread::sleep_for(). Você receberá exemplos de código prontos, saberá qual método escolher para sua tarefa e aprenderá a evitar erros comuns.

\n\n

Método padrão: std::this_thread::sleep_for (C++11 e posteriores)

\n\n

A partir do padrão C++11, a linguagem ganhou a biblioteca <chrono> e a capacidade de pausa portátil de thread. Este é o método mais correto e recomendado para código C++ moderno.

\n\n

Como funciona

\n\n

A função std::this_thread::sleep_for() recebe um intervalo de tempo, definido usando std::chrono::duration. Você simplesmente especifica a quantidade de milissegundos, e a thread "dorme" por esse tempo.

\n\n

Exemplo 1: Pausa básica de 500 ms

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nint main() {\n    std::cout << "Iniciando contagem...\\n";\n    \n    // Pausa de 500 milissegundos\n    std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    \n    std::cout << "Meio segundo se passou!\\n";\n    return 0;\n}
\n\n

Este código funcionará no Windows, Linux, macOS e qualquer outra plataforma com um compilador C++11/14/17/20. Sem #ifdef, sem chamadas de sistema.

\n\n

Exemplo 2: Pausa com variável

\n\n

Se você precisar definir o tempo dinamicamente:

\n\n
#include <iostream>\n#include <thread>\n#include <chrono>\n\nvoid process_with_delay(int delay_ms) {\n    std::cout << "Processando com pausa de " << delay_ms << " ms...\\n";\n    std::this_thread::sleep_for(std::chrono::milliseconds(delay_ms));\n    std::cout << "Pronto!\\n";\n}\n\nint main() {\n    process_with_delay(200);\n    process_with_delay(1000);\n    return 0;\n}
\n\n

Importante: precisão do sleep_for

\n\n

A função sleep_for() não garante precisão absoluta em microssegundos. O tempo real de despertar pode ser um pouco maior (alguns milissegundos) devido ao escalonador do sistema operacional. Para a maioria das tarefas (animações, timeouts, consulta a sensores), isso é suficiente. Se você precisar de precisão de microssegundos, veja a seção "Quando a precisão é crítica".

\n\n

Método clássico: Sleep() para Windows

\n\n

Se você está escrevendo código apenas para Windows (por exemplo, um projeto antigo no Visual Studio), pode usar a função Sleep() da API do Windows. Ela "dorme" exatamente em milissegundos.

\n\n

Exemplo 3: Pausa de 1 segundo no Windows

\n\n
#include <iostream>\n#include <windows.h> // Obrigatório incluir\n\nint main() {\n    std::cout << "Aguardando 1 segundo (Windows)...\\n";\n    Sleep(1000); // Argumento em milissegundos\n    std::cout << "Acordamos!\\n";\n    return 0;\n}
\n\n

Desvantagens:

\n