我有一个tcl脚本需要几分钟才能运行(执行时间根据不同的配置而有所不同)。
我希望用户能够了解它是否仍在执行以及脚本执行时需要多长时间才能完成。
到目前为止我的一些想法:
1)使用...表示它随着每次内部命令运行而不断增加。但同样,它并没有真正让人感觉到第一次使用者需要多少钱。
2)使用我见过很多地方的旋转斜线。
3)在屏幕上显示实际百分比输出。不知道这是否可行或如何去做。
有没有人对可以做什么有任何想法,以便脚本用户了解正在发生的事情以及如何做到这一点?
此外,如果我使用...实现它,我如何让它们打印出来。每次都在同一条线上。如果我使用puts在tcl脚本中执行此操作。只是打印在下一行。
对于旋转斜线,我需要更换已在屏幕上打印的内容。我怎么能用tcl做这个?
答案 0 :(得分:2)
首先,打印点问题的原因是Tcl正在缓冲其输出,等待换行。这通常是一种有用的行为(通常足以让它成为默认值),但在这种情况下不需要它,所以你可以通过以下方式将其关闭:
fconfigure stdout -buffering none
(其他缓冲选项为line
和full
,它们提供越来越高的缓冲级别,以提高性能但降低响应速度。)
或者,在打印点后执行flush stdout
。 (或者将点打印到stderr
,默认情况下是无缓冲的,主要是因为错误消息。)
做一个微调器并不比印刷点硬得多。关键的技巧是使用回车(一种不可打印的字符,有时可视化为^M
)将光标位置移回到行的开头。很好的将微调器代码分解为一个小程序:
proc spinner {} {
global spinnerIdx
if {[incr spinnerIdx] > 3} {
set spinnerIdx 0
}
set spinnerChars {/ - \\ |}
puts -nonewline "\r[lindex $spinnerChars $spinnerIdx]"
flush stdout
}
然后您需要做的就是定期致电spinner
。简单! (另外,完成后在旋转器上打印一些东西;只需执行puts "\r$theOrdinaryMessage"
。)
一直到实际的进度表很好,它建立在这些技术的基础上,但它要求你计算出要做多少处理等等。微调器更容易实现! (特别是如果你还没有确定要完成的工作量。)
答案 1 :(得分:1)