Ir ao conteúdo
  • Cadastre-se

Problema com usleep no Linux


IromWalrider

Posts recomendados

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;}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...