Maneira de recurso amigável para indicar ao programa do usuário não está pendente

10

Eu tenho um script Perl em um sistema * nix que, em um ponto, está processando mais de 50.000 linhas de texto. Isso leva algum tempo. Eu estou tentando encontrar um recurso amigável maneira de informar ao usuário que o programa não está pendurado enquanto está processando todo este texto.

Atualmente, imprimo a saída em tempo real enquanto o texto está sendo processado. Estou liberando o buffer de saída e imprimindo a saída em uma linha com \r . Isso parece ser um uso desnecessário de recursos porque leva quase o dobro do tempo do que quando eu imprimo nada, mas como eu disse, quando imprimindo nada, parece que o programa está travando.

Então, minha pergunta: existe uma maneira padrão ou simples de informar ao usuário que o programa está sendo executado durante a execução de tarefas de longa duração?

    
por BryanK 31.10.2013 / 15:27

2 respostas

6

[Eu acabei de perceber que seu script é perl , mas a mesma lógica se aplica, print "\r" , etc. Você vai querer usar STDERR ou desligar o buffer, $| = 1 . Veja no fundo.]

Uma maneira de implementar um "indicador de progresso" da CLI envolve o uso do caractere \r (retorno de carro). Isso traz o cursor para o começo da linha atual:

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

Se não fizer sentido, tente.

Você poderia usar essa técnica para indicar quantas linhas, ou milhares de linhas, foram processadas até o momento. Dezenas ou centenas de linhas podem ser boas, já que não é muito frequente (mais atualizações == tempo de execução mais lento), mas provavelmente ainda com freqüência suficiente para mostrar que o progresso está continuando. Você pode especificar uma unidade ou apenas acrescentar zeros.

Observe o uso de -n e -e com echo , isso é importante.

Você também pode usar \b (backspace) para efeito semelhante.

Em perl:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               
    
por 31.10.2013 / 15:40
3

Imprima um único . sem fazer eco de uma nova linha enquanto você processa. Técnica de velhice.

Então você tem:

Processing...............

Simples e eficaz.

    
por 31.10.2013 / 15:30

Tags