1 |
package progress_bar; |
2 |
|
3 |
use warnings; |
4 |
use strict; |
5 |
|
6 |
use Time::HiRes qw/time/; |
7 |
use Data::Dump qw/dump/; |
8 |
|
9 |
our $start_t; |
10 |
our $last_t; |
11 |
|
12 |
sub start { |
13 |
$start_t = $last_t = time(); |
14 |
} |
15 |
|
16 |
sub tick { |
17 |
die "arguments wrong: ",dump( @_ ) unless $#_ == 2; |
18 |
my ($file, $pos, $size) = @_; |
19 |
|
20 |
return unless $size; |
21 |
|
22 |
my $t = time(); |
23 |
return unless $start_t == $last_t |
24 |
|| $pos == $size |
25 |
|| $t - $last_t > 0.75 # s |
26 |
; |
27 |
|
28 |
$last_t = $t; |
29 |
$t -= $start_t; |
30 |
return unless $t; |
31 |
|
32 |
my $speed = $pos / $t; |
33 |
return unless $speed; |
34 |
|
35 |
printf STDERR "%s %d/%d %.2f%% %.2f K/s ETA %.1fs \r" |
36 |
, $file, $pos, $size |
37 |
, $pos * 100 / $size |
38 |
, $speed / 1024 |
39 |
, ( $size - $pos ) / $speed |
40 |
; |
41 |
} |
42 |
|
43 |
1; |