2

実行に数分かかる tcl スクリプトがあります (実行時間は構成によって異なります)。

スクリプトがまだ実行されているかどうか、およびスクリプトの実行中に完了するまでにどれくらいの時間がかかるかについて、ユーザーに何らかの考えを持ってもらいたいのです。

私がこれまでに持っていたアイデアのいくつか:

1)内部コマンドの実行ごとに増加し続ける...を使用してそれを示します。しかし、繰り返しになりますが、初めてのユーザーにとっては、あとどれだけのことができるかはわかりません.

2) 多くの場所で使用されている回転スラッシュを使用します。

3) 画面に実際のパーセンテージの完了出力を表示します。これが実行可能かどうか、またはどうすればよいかわかりません。

スクリプトのユーザーが何が起こっているのか、どのようにこれを行うのかを理解できるようにするために、何ができるかについて何かアイデアを持っている人はいますか?

また、 ... を使用して実装している場合、どうすれば . 毎回同じラインで。Tcl スクリプトで puts を使用してこれを行うと、. 次の行に出力されるだけです。

また、回転スラッシュについては、既に画面に表示されているものを置き換える必要があります。どうすればtclでこれを行うことができますか?

4

2 に答える 2

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"。)

実際のプログレスメーターに到達するのは良いことであり、これらの手法に基づいていますが、実行する処理の量などを計算する必要があります。スピナーは実装がはるかに簡単です!(特に、実行する作業の量をまだ特定していない場合)。

于 2012-12-12T10:07:02.017 に答える