找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5709|回复: 20

[LISP函数]:纯LISP写的状态行进度条

[复制链接]

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-2-7 10:47:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
显示进度条常用的方法是通过express或doslib,使用上有些局限性.
以下提供一种纯lisp方法供大家讨论:

[PHP]
(DEFUN c:test (/ i)
  (GRTEXT -1 "测试进程")
  (SETQ i -1)
  (REPEAT 10000 (progress (SETQ i (1+ i)) 10000 3))
  (GRTEXT)
)

(DEFUN progress        (i n bit / BOX INTEGER NUM REMAINDER)
  (SETQ        box (NTH bit
                 '(("")
                   ("" "▌")
                   ("" "▎" "▌" "▊")
                   ("" "▏" "▎" "▍" "▌" "▋" "▊" "▉")
                  )
            )
  )
  (SETQ num (EXPT 2 bit))
  (SETQ integer (FIX (/ (* 20 num i) n)))
  (SETQ remainder (REM integer num))
  (GRTEXT -2
          (STRCAT (SUBSTR "████████████████████"
                          1
                          (* 2 (FIX (/ integer num)))
                  )
                  (NTH remainder box)
          )
  )
)
[/PHP]

函数解释:
1.progress函数中的bit参数可以理解为状态行显示精度,也就是希望将黑块"█"细化为几份.接受0,1,2,3四个精度值.
2.使用nth的理由见下面的速度测试,毕竟不值得在显示进度条时花费不必要的时间.
3. (GRTEXT -1 "测试进程")语句需独立出来,不得加入进度条函数,否则状态行会频繁闪动,影响显示效果.
4."████████████████████"可根据需要替代为间断的,如"▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊"

[php]
(DEFUN Box1 (/ BOX I)
  (SETQ i -1)
  (REPEAT 8
    (SETQ i (1+ i))
    (SETQ box (NTH i '("" "▏" "▎" "▍" "▌" "▋" "▊" "▉")))
  )
)

(DEFUN Box2 (/ BOX I)
  (SETQ i -1)
  (REPEAT 8
    (SETQ i (1+ i))
    (COND ((= i 0) (SETQ box ""))
          ((= i 1) (SETQ box "▏"))
          ((= i 2) (SETQ box "▎"))
          ((= i 3) (SETQ box "▍"))
          ((= i 4) (SETQ box "▌"))
          ((= i 5) (SETQ box "▋"))
          ((= i 6) (SETQ box "▊"))
          ((= i 7) (SETQ box "▉"))
    )
  )
)
(DEFUN Box3 (/ BOX I)
  (SETQ i -1)
  (REPEAT 8
    (SETQ i (1+ i))
    (SETQ box (STRCAT (CHR 168) (CHR (- 136 i))))
  )
)
(DEFUN Box4 (/ BOX BOX0 BOX1 BOX2 BOX3 BOX4 BOX5 BOX6 BOX7 I)
  (SETQ Box0 "")
  (SETQ Box1 "▏")
  (SETQ Box2 "▎")
  (SETQ Box3 "▍")
  (SETQ Box4 "▌")
  (SETQ Box5 "▋")
  (SETQ Box6 "▊")
  (SETQ Box7 "▉")
  (setq i -1)
  (REPEAT 8
    (SETQ i (1+ i))
    (setq box (EVAL (READ (STRCAT "Box" (ITOA i)))))
  )
)

;;Benchmarking .................Elapsed milliseconds / relative speed for 16384 iteration(s):
;;
;;    (BOX1).....1234 / 1.72 <fastest>
;;    (BOX2).....1469 / 1.45
;;    (BOX3).....1656 / 1.28
;;    (BOX4).....2125 / 1 <slowest>
[/php]

执行效果:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 24个

财富等级: 恭喜发财

 楼主| 发表于 2007-2-8 12:53:51 | 显示全部楼层
因为频繁调用grtext写状态行影响执行效率,
故再次改进如下,在不影响进度条显示的前提下,减少调用grtext的次数.保留首贴的目的是方便比较两种方式.
执行次数已经改变为100000,但最多调用160次grtext,显示效果不变
[php]
(DEFUN c:test (/ i)
  (GRTEXT -1 "测试进程")
  (SETQ i -1)
  (REPEAT 100000 (progress (SETQ i (1+ i)) 100000 3))
  (GRTEXT)
)

(DEFUN progress        (i n bit / BOX INTEGER NUM REMAINDER)
  (SETQ num (EXPT 2 bit))
  (IF (OR (<= n (* num 20))
          (AND (> n (* num 20)) (= (REM i (FIX (/ n num 20))) 1))
      )
   (PROGN (SETQ box (NTH bit
                          '(("")
                            ("" "▌")
                            ("" "▎" "▌" "▊")
                            ("" "▏" "▎" "▍" "▌" "▋" "▊" "▉")
                           )
                     )
           )
           (SETQ integer (FIX (/ (* 20 num i) n)))
           (SETQ remainder (REM integer num))
           (GRTEXT -2
                   (STRCAT (SUBSTR "████████████████████"
                                   1
                                   (* 2 (FIX (/ integer num)))
                           )
                           (NTH remainder box)
                   )
           )
    )
  )
)
[/php]

点评

很给力!  发表于 2013-4-29 20:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-7 22:11:47 | 显示全部楼层
中间的算法看不大懂,收藏,回去再好好学学。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-22 00:09:06 | 显示全部楼层
最初由 WHGF 发布
[B]显示效果不错,算你很!!!!
收藏 [/B]


是不是流浪水手阿?

上面的进度条很好,收藏了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-16 12:06:00 | 显示全部楼层
能否,改进一下,增加百分数显示,且百分数显示的位置固定在进度条的中间。搂主没有联系方式,联系不上!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-15 18:36:47 | 显示全部楼层
进度时间,相当的OK
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-9-2 23:39:11 | 显示全部楼层
程序不错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-9-12 18:26:45 | 显示全部楼层
看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2010-1-9 23:02:30 | 显示全部楼层
不错的东东,代码思维需要慢慢琢磨消化,谢谢LZ.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3191个

财富等级: 富可敌国

发表于 2013-6-12 13:17:12 | 显示全部楼层
他山之石可以攻玉,慢慢研究
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-8-14 14:12:53 | 显示全部楼层
这个牛逼了。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 55个

财富等级: 招财进宝

发表于 2014-3-9 15:58:15 | 显示全部楼层
不错。。有对话形式的吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-7-11 15:43:33 | 显示全部楼层
挺不错的,就是不知道怎么用、什么情况用!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-2-12 10:08:17 | 显示全部楼层
是不是流浪水手阿;P
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 16个

财富等级: 恭喜发财

发表于 2018-1-31 16:24:08 | 显示全部楼层
厉害了    顶顶顶
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-13 15:02 , Processed in 0.223018 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表