2012-01-21 15 views
10

コンソールで作業進捗状況を示す最も簡単な方法は何ですか?パーセンテージを出力するだけで十分です。プログレスバーは必要ありません。コンソールで簡単な進捗状況を表示

ちょうどprintを使用すると、ロットの行が生成されます。端末内に1つの変更文字列が必要です。

+0

は、再描画が許可される「cls」ですか? –

+0

また、改行を表示しない 'echo'という形式を使うこともできます。したがって、' back 1 symbol erase'制御文字があるので、 -/| \で作られた回転子アニメーションを作ることができます –

+1

私のハスケルは一見言うと錆びていますが、正しく覚えていれば最後にputStrを使用すると改行せずにキャリッジリターンを行い、あなたが書いている行を上書きできるはずです。 –

答えて

21

最も簡単な方法は、wgetやその他のプログラムが行うことです:進捗情報の前に改行とANSI消去コードを印刷して、カーソルを行の先頭に戻して既存のテキストを置き換えます。たとえば:あなたは次の進行状況の更新に行の先頭に戻ることができるように

import Control.Monad 
import Control.Concurrent 
import System.IO 
import Text.Printf 

putProgress :: String -> IO() 
putProgress s = hPutStr stderr $ "\r\ESC[K" ++ s 

drawProgressBar :: Int -> Rational -> String 
drawProgressBar width progress = 
    "[" ++ replicate bars '=' ++ replicate spaces ' ' ++ "]" 
    where bars = round (progress * fromIntegral width) 
     spaces = width - bars 

drawPercentage :: Rational -> String 
drawPercentage progress = printf "%3d%%" (truncate (progress * 100) :: Int) 

main :: IO() 
main = do 
    forM_ [0..10] $ \i -> do 
    let progress = fromIntegral i/10 
    putProgress $ drawProgressBar 40 progress ++ " " ++ drawPercentage progress 
    threadDelay 250000 
    putProgress "All done." 
    hPutChar stderr '\n' 

ここで重要なことはないにあるが、改行を出力します。もちろん

、あなたはちょうどここ割合をプリントアウトし、バーをドロップしますが、バーが低温である可能性があり:)

+7

'stdout'の代わりに' stderr'に出力することをお勧めします。自動的にフラッシングするので、プログレスバーが狂っていなくてもこのプログラムをパイプで使用することができます。 – dflemstr

+0

@dflemstr:良い点!私はstderrに出力する簡単なソリューションでコードを更新しました。 – ehird

3

私は本当に迅速かつ汚い何かをしたい場合は、私は何をする傾向があることがちょうどシーケンスを印刷していますドットの"もう少し"進歩があるたびに、別のドット(改行なし)を書きます。私はドットが1秒あたりのドットの時間スケールの周りに来るように "進歩のビット"の尺度を調整します。それほど精巧ではありませんが、プログラムが何かをしていることを示しています。

実際に「進捗状況」がどれくらいあるかについての尺度があります(私はしばしばそうしませんが、これはあなたのパーセンテージの言及によって示唆されます)。 Xの点を印刷し、1/Xの進捗を行うたびに印刷します。

関連する問題