Barra de Progresso no terminal [ ########## ] 100%

Iniciado por rafael, Abril 26, 2017, 01:57:43 PM

tópico anterior - próximo tópico

rafael

Estou tentando fazer uma barra de progresso para o terminal mas tá difícil...


para i = 1, 100 inicio
imprima('\r ', i)
sis.durma(1000)
fim

adalberto

#1
Segue um exemplo:


//progresso em prisma terminal
local bar = '';
local str_fmt = string.formate;
para i = 1 , 100 inicio
  bar = bar .. '#'
  progresso = str_fmt('[%s]%d%%\r', bar, i);
  es.escreva(progresso);
  es.esvazie();
  sis.durma(1000);
fim



Observe que é necessário esvaziar o buffer de saída (es.esvazie) para que o resultado seja mostrado imediatamente, visto que em situação normal é o escape \n que faz isso. Neste caso não queremos ir para próxima linha.

Perceba que usei funções da biblioteca string, es (entrada e saída) e sis (sistema operacional);

PS.: o %s é substituído por uma string na função string.formate
       o %d por um número inteiro e o %% por um '%' sinal de porcentagem.

      Você poderia usar o operador de unir strings '..' (dois pontos) ao invés de usar string.formate, eu prefiro usar a função.
     Por questão de eficiência e rapidez declare uma variável local para função string.formate:
     local str_fmt = string.formate;
    assim use str_fmt dentro do laço 'para', desse jeito é mais rápido.
Falou...

adalberto

Preparando esse exemplo, percebi um bug no linux:

a função sis.durma() não aceita parâmetro menor que 1000, caso seja passado 300, por exemplo, é tratado como se fosse zero e não espera tempo algum. Já corrigi e vou postar na próxima versão.

rafael

brigadão Adalberto,
aproveitando pra deixar um código mais refinado:

        local barra = {}
        para i=1, 100 inicio
        barra[i] = '-'
        fim
local str_fmt = string.formate;
para i=1,100 inicio
        barra[i] ="■"
       
        local progresso = str_fmt('|%s| %d%%\r', tabela.concat(barra,""), i)
       es.escreva(progresso)
       es.esvazie()
       sis.durma(1000)
       
fim


■■■■■■■■■■■■■■■■■■■■■■■■■■-------------------------------------------------------------------------]27%