Usar a função sleep() em C e multiplataforma

Em relação a linguagem C, a função que faz um sleep não é uma função padrão da linguagem. Nesse sentido, é necessário incluir uma biblioteca que contenha uma função que cumpra esse objetivo.

Logo de início é bom apresentar um problema relacionado com o sleep: ele varia de acordo com o sistema operacional que você estiver utilizando. No Windows, é necessário utilizar a função Sleep() que está na biblioteca Windows.h. Em um sistema UNIX, como é o caso do Linux, pode ser necessário utilizar a função sleep() ou a usleep(), que fazem parte da biblioteca unistd.h. Além do nome da função e biblioteca necessária, o funcionamento da função é diferente dependendo do sistema operacional. Por esses motivos, seu código precisa ser adaptado se você estiver no Windows ou um sistema Unix.

Se você está interessado em saber como fazer uso do sleep apenas no Windows, pode ir direto para meu post função sleep() no Windows.

A função sleep() do Unix espera um valor inteiro positivo (representando os segundos). Se você precisar de um intervalo menor de segundos (como 0,5 segundo) é necessário utilizar a função usleep(), que suspende a execução com um parâmetro em microssegundos.

A função Sleep() no Windows espera um valor inteiro positivo que representa os milissegundos. Sendo assim, mesmo que as funções tenham o mesmo nome no Windows e Unix, seus parâmetros esperados estão em grandezas de tempo diferentes. Também é importante observar que a função Sleep() no Windows inicia com sua primeira letra em maiúsculo.

Por esse motivo eu prefiro escrever o código que faz uso do sleep de forma multiplataforma (cross-plataform) e por isso trago um código nesse sentido. O código é mostrado a seguir e é responsável por escrever um “.” (ponto) a cada meio segundo.

#include <stdio.h>

#ifdef _WIN32 || _WIN64
    #include <Windows.h>
#else
    #include <unistd.h>
#endif

int main() {
  int i=0;

  while (i++ < 10) {
      #ifdef _WIN32 || _WIN64
        //Sleep(1000); // Sleep 1 segundo
        Sleep(500); // Sleep 0,5 segundo
      #else
        //sleep(1); // Sleep 1 segundo
        usleep(500*1000);  // Sleep 0,5 segundo (500 milisegundos)
      #endif
      printf(".");
  }

  return 0;
}

Para o código multiplataforma utilizo a diretiva #ifdef no meu código. As diretivas #ifdef e #ifndef são diretivas de pré-processamento.

Em síntese, #ifdef verifica se algo está definido. A diretiva #ifndef verifica o oposto da condição verificada por #ifdef. No meu código eu utilizo #ifdef para verificar se estou utilizando um sistema Windows (aceitando 32 ou 64 bits). O funcionamento é bem similar ao uso do desvio condicional if, inclusive com a opção do else.

Com isso, quando o código for compilado, é verificado se estou no Windows ou não, compilando com o uso da biblioteca (trecho de código das linhas 3-7) e instruções adequadas ao meu sistema operacional (trecho de código das linhas 13-19).

Vale dizer que devem existir diversas formas de trazer esse funcionamento do sleep, mas eu mostrei a forma que eu utilizo.

Share

Uma opinião sobre “Usar a função sleep() em C e multiplataforma

  1. Pingback: Usar a função sleep() em C no Windows – Algoritmos e programação

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.