2012-12-12 34 views
2

我有一個tcl腳本,需要幾分鐘的時間運行(執行時間根據不同的配置而有所不同)。在屏幕上打印在我的tcl腳本運行時完成的百分比?

我希望用戶對它是否仍在執行以及腳本執行時需要多長時間有一些瞭解。

有些想法到目前爲止我有:

1)表明它使用......這一直與每個內部運行的命令或因此增加。但是,它並沒有真正體會到第一次使用的用戶還有多少。

2)使用我見過的許多地方使用的旋轉斜線。

3)在屏幕上顯示實際輸出的百分比。不知道這是否可行或如何去做。

有沒有人有什麼可以做什麼的想法,使腳本的用戶瞭解發生了什麼,以及如何做到這一點?

此外,如果我正在使用...執行它,我如何讓他們打印。每次都在同一行上。如果我在tcl腳本中使用put來做到這一點的話。只是打印在下一行。

而對於旋轉的斜線,我需要替換已經打印在屏幕上的東西。我如何用tcl來做到這一點?

+0

我嘗試使用put的-nonewline選項。但是這只是在腳本的最後打印出所有的點,而不是在執行過程中逐個打印。 這就是我曾經嘗試過的--nonewline「。」 – egorulz

回答

2

首先,之所以你有問題的印刷點是Tcl的是緩衝輸出,等待新的生產線。這往往是一個有用的行爲(往往不夠,它的默認值),但這樣你把它關掉它不是在這種情況下想:

fconfigure stdout -buffering none 

(其它緩衝選項linefull,它提供逐步提高緩衝,以改善性能,但降低了反應性水平。) 可替換地,打印點後做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

如果您不想在該行的最開始處使用微調器(或百分比或其他),請使用退格符'\ b'而不是回車符。 – potrzebie

+0

真棒:)這正是我想要的。 – egorulz

+0

FWIW,我從SQLite的創建者那裏獲得了這個技巧...... –

1

標準輸出流最初是行緩衝的,所以在寫入換行符之前,您不會看到新的輸出,請致電flush或關閉它(腳本退出時自動完成)。你可以把這個緩衝關閉...

fconfigure stdout -buffering none 

...但診斷,錯誤信息,進度等應該被寫入stderr流來代替。它的默認緩衝設置爲none,所以你不需要fconfigure。