免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 25894 | 回复: 39
打印 上一主题 下一主题

几种常用的显示程序运行进度的小方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-26 13:06 |只看该作者 |倒序浏览
非常怀念DOS时代在程序中显示进度的方法,当时觉得那些程序非常酷(记得是JAR,一个压缩程序,进度在原地显示,有百分比),因为倾我所学,也不知道如何实现。在PERL代码中,我一直使用的就是滚屏显示进度。今天看有人跟老大吵架的贴,找到了灵感,贴出来跟大家共享一下。

1、方法1

  1. my $max = 100;
  2. for(1..$max) {
  3.         my $percent = $_/$max*100;
  4.         print "$_ - $percent % OK!\n";
  5.         sleep(1);
  6. }
  7. <STDIN>;
复制代码
这是我最常用的方法,在处理大量数据时,我从屏幕上能看到进度,虽然它会消耗一些额外的时间。这种方法简单,稳定,而且容易实现,随意使用。

2、方法2

  1. #!/usr/bin/perl -w

  2. $| = 1;
  3. my $max = 10;
  4. for(1..$max) {
  5.         print ".";
  6.     print " Complete!" if ($_ == $max);
  7.         sleep(1);
  8. }
  9. <STDIN>;
复制代码
这也是DOS时代非常经典的进度指示,从“…..”的长度来判断进度。

3、方法3

  1. #!/usr/bin/perl -w

  2. local $| = 1;
  3. my @progress_symbol = ('-','\\','|','/');
  4. my $n = 0;
  5. for(my $i=1;$i<=3000;$i++){
  6.         print "\r $progress_symbol[$n] $i";
  7.          $n = ($n>=3)? 0:$n+1;
  8.         select(undef, undef, undef, 0.1);
  9. }
  10. local $| = 0;

  11. <STDIN>;
复制代码
用滚轮在原地显示进度,当然也可以加入百分比,这是我一直认为非常酷的方法,以后会加入自己的程序。

4、方法4

  1. #!/usr/bin/perl -w

  2. local $| = 1;
  3. while (1){
  4.         &gettime;
  5.         print "\r $now";
  6.         sleep(1);
  7. }
  8. local $| = 0;
  9. exit;

  10. sub gettime {
  11.         my ($sec,$min,$hour,$day,$mon,$year,$weekday,$yeardate,$savinglightday) = (localtime(time));
  12.         $sec = ($sec < 10)? "0$sec":$sec;
  13.         $min = ($min < 10)? "0$min":$min;
  14.         $hour = ($hour < 10)? "0$hour":$hour;
  15.         $day = ($day < 10)? "0$day":$day;
  16.         $mon = ($mon < 9)? "0".($mon+1):($mon+1);
  17.         $year += 1900;
  18.         $now = "$year.$mon.$day $hour:$min:$sec";
  19. }
复制代码
在原地显示走时的数字时钟,可以加入百分比,也很酷。

5、方法5

  1. #!/usr/bin/perl -w
  2. # Author: Zhao
  3. # Date: 2009.12.22
  4. # Purpose: simulate the progress bar

  5. $n = 30;
  6. for($i=1;$i<=$n;$i++){
  7.         proc_bar($i,$n);
  8.         select(undef, undef, undef, 0.2);
  9. }
  10. <STDIN>;

  11. sub proc_bar{
  12.         local $| = 1;
  13.         my $i = $_[0] || return 0;
  14.         my $n = $_[1] || return 0;
  15.         print   "\r [ ".("\032" x int(($i/$n)*50)).(" " x (50 - int(($i/$n)*50)))." ] ";
  16.         printf("%2.1f %%",$i/$n*100);
  17.         local $| = 0;
  18. }
复制代码
从吵架贴里看到的,在我看来比较高级的方法,有百分比,有不断增长的进度条。

另有一个叫Term:rogressBar,也很好,但我的程序没有那么复杂,有兴趣的可以研究一下。CPAN上还有一些其他显示进度的模块。

$|变量的作用:
$|变量设置为真时,每输出一次,STDOUT缓冲会被强制清空


以上是自己摸索出的小方法,希望对大家有帮助,若有其他方法,请贴出来共享。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-05-26 13:25 |只看该作者
我今天也是刚从吵架贴里学了这个。哈哈,没想到吵架贴也创造了生产力

论坛徽章:
0
3 [报告]
发表于 2010-05-26 13:26 |只看该作者
#!/bin/sh

b=''
for ((i=0;$i<=100;i+=2))
do
        printf "progress:[%-50s]%d%%\r" $b $i
        sleep 0.1
        b=#$b
done
echo

论坛徽章:
0
4 [报告]
发表于 2010-05-26 13:35 |只看该作者
3楼用的是什么语言?好像不是PERL啊

论坛徽章:
0
5 [报告]
发表于 2010-05-26 13:37 |只看该作者


shell~~~~

论坛徽章:
0
6 [报告]
发表于 2010-05-26 13:39 |只看该作者
藏了

论坛徽章:
0
7 [报告]
发表于 2010-05-26 15:53 |只看该作者
太感谢了!这些东西加到程序里面肯定非常酷啊
感谢分享,一下子发了这么多方法,太爽啦

论坛徽章:
0
8 [报告]
发表于 2010-05-26 17:11 |只看该作者
赞,另外问你一下 select(undef, undef, undef, 0.2); 这句的作用?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
9 [报告]
发表于 2010-05-26 17:23 |只看该作者
回复 8# liyangole


    sleep 0.2秒

论坛徽章:
0
10 [报告]
发表于 2010-05-26 17:52 |只看该作者
回复 9# yybmsrs


    多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP