Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Хочу сделать шкалу прогресса


Автор: apook 1.10.2007, 14:44
Хочу сделать текстовую "прогресс" шкалу закачки файлов. 
Цитата

 |***********----------------------------| 

причем одна прогресс количества файлов, вторая прогресс для каждого файла
Задача: Определить количество файлов(для первой шкалы)
              Определять размер каждого файла, его закачка(непонятно как чтоб отображать в прогрессе) 
Реализовать сам вывод( c этим проще ).

Ваши предложения. smile

Автор: fray 1.10.2007, 18:20
Use Curses; #!!!! use Curses::UI; крутая вещб но под unix

Автор: shamber 2.10.2007, 07:46
fray, под win тоже есть, правда слегка урезаный smile Хотя если самому компилить, может и собереться smile

Автор: KSURi 10.10.2007, 23:59
Я не совсем понял: как файл закачивается? Топик вроде не в вебовом разделе расположен, так что это не через HTTP, да?

Автор: shamber 11.10.2007, 13:50
KSURi, ему просто хочется в Console выводить красивый вывод(ссори за тафтологию). Показать пользователю, что прога работает. smile

Автор: KSURi 11.10.2007, 17:03
а ну тогда, если под винды можно заюзать Win32::Console

Автор: Perl_sapiens 3.3.2008, 23:03
 smile  вывода такого ПрогрессБара

Автор: nitr 16.3.2008, 23:35
Было уже на форуме, вот интересно:

ProgressBar.pm
Код

package ProgressBar;
use File::Basename;

my $max = 50;

sub new {
    local $| = 1;
    my ($class, $filename) = @_;
    my $self = bless {}, $class;
    $self->{SIZE} = -s($filename);
    $self->{STEP} = int($self->{SIZE} / $max);
    $self->{NUM} = 0;
    $self->{CURR} = undef;
    my $caption = basename($filename);
    $caption =~ m!^(.{1,8})!;
    $caption = $1;
    print "$caption:\t";
    for (my $j = 0; $j < $max; $j++) { print chr(176) };
    for (my $j = 0; $j < $max; $j++) { print chr(8) };
    return $self;
}
sub DESTROY {print "\n"}

sub render{
    local $| = 1;
    my $self = shift;
    if (@_) { $self->{CURR} = shift }
    my $number_for_add = $self->{CURR} - $self->{NUM}  * $self->{STEP};
    if ($number_for_add > 0) {
        $number_for_add = int($number_for_add / $self->{STEP});
        $self->{NUM} += $number_for_add;
        for (my $j = 0; $j < $number_for_add; $j++) { print chr(219) };
    }
    return $self->{NUM};  
}

1;


sample.pl
Код

#!perl
use strict;
use ProgressBar;

my $in_file = 'filename';
my $progress = new ProgressBar($in_file);
open my $fh, '<', $in_file || die "can't open file $!\n";
while (my $line = <$fh>){
  $progress->render(tell $fh);
  #текст программы
}
close $fh;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)