Ir ao conteúdo
  • Cadastre-se
IromWalrider

Problema com usleep no Linux

Recommended Posts

Olá, sou novo neste fórum.

 

Eu estou com um problema em um programa em c++, no (L)Ubuntu.

Eu fiz uma barra de progresso em ASCII para terminal, e uso um loop para controlar o fim do carregamento. O problema é que eu preciso que esse loop tenha um delay de 0,5s, e para isso eu uso usleep de unistd.h. Esta função tem como parâmetro o tempo do delay em microssegundos. Porém no meu programa eu uso usleep(500000) (equivalente a 0,5s) e eu tenho um delay de 2s ! 

Eu já tentei user outras funções como sleep e nanosleep mas obtive o mesmo resultado.

Alguém de você poderia me ajudar?

 

main.cpp:

/*  * File:   main.cpp * Author: iromwalrider * * Created on 26 de Janeiro de 2015, 17:14 */#include <cstdlib>#include <stdio.h>#include <unistd.h>#include <time.h>using namespace std;/* *  */static inline void loadBar(int x, int n, int r, int w){    // Only update r times.    if ( x % (n/r ) != 0 ) return;     // Calculuate the ratio of complete-to-incomplete.    float ratio = x/(float)n;    int   c     = ratio * w;     // Show the percentage complete.    printf("%3d%% [", (int)(ratio*100) );     // Show the load bar.    for (int x=0; x<c; x++)       printf("=");     for (int x=c; x<w; x++)       printf(" ");     // ANSI Control codes to go back to the    // previous line and clear it.    printf("]\n\033[F\033[J");}int main(int argc, char** argv) {    for (int i=0;i<=150;i++)    {   usleep(500000);        loadBar(i,150,9,10);    }        return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em C:

#include <stdio.h>#include <time.h>int main(void){    int i;    struct timespec tempo = { 0, 500 * 1000 * 1000 };    for (i=1; i<=5; i++)    {        printf("i=%d, dormindo...\n", i);        nanosleep(&tempo, NULL);    }    return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode testar com algo assim:

 

#include <stdio.h>#include <time.h>#define BILHAO 1000000#define TRILHAO 1000000000int main(void){    int i;    long total_antes_ns, total_depois_ns;    struct timespec tempo = { 0, 500 * BILHAO }, antes, depois;    for (i=1; i<=5; i++)    {        clock_gettime(CLOCK_MONOTONIC, &antes);        nanosleep(&tempo, NULL);        clock_gettime(CLOCK_MONOTONIC, &depois);        total_antes_ns = (TRILHAO * antes.tv_sec) + antes.tv_nsec;        total_depois_ns = (TRILHAO * depois.tv_sec) + depois.tv_nsec;        printf("i=%d, antes: %ld ns, depois: %ld ns, delta: %f ms\n", i, total_antes_ns,            total_depois_ns, (double) (total_depois_ns - total_antes_ns) / BILHAO);    }    return 0;}
Saída:

 

i=1, antes: 132230026862718 ns, depois: 132230526948278 ns, delta: 500.085560 msi=2, antes: 132230527142943 ns, depois: 132231027204897 ns, delta: 500.061954 msi=3, antes: 132231027238954 ns, depois: 132231527298103 ns, delta: 500.059149 msi=4, antes: 132231527328166 ns, depois: 132232027386652 ns, delta: 500.058486 msi=5, antes: 132232027417202 ns, depois: 132232527476521 ns, delta: 500.059319 ms

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×