There's a [progress](https://github.com/euantorano/progress.nim) module in 
nimble:

`nimble install progress`

Here's a (very crude) example of using it with spawn:
    
    
    # https://github.com/euantorano/progress.nim
    
    import os, strutils, progress, threadpool
    
    const
      dumpFileTargetMb = 20_000
      dumpFileName = getTempDir() / "dumpfile.tmp"
      dumpFileTargetBytes = dumpFileTargetMb * 1024 * 1024
    
    proc prepare() =
      discard tryRemoveFile(dumpFileName)
      setControlCHook(
        proc() {.noconv.} =
        echo "\n\n Terminated! \n\n"
        quit(1)
      )
      echo "Filling up $1 to $2mb..." % [dumpFileName, $dumpFileTargetMb]
    
    proc createDumpFile() =
      const
        pageSize = 4096
        buffer = ' '.repeat(pageSize)
        pagesTotal = dumpFileTargetBytes div pageSize
      var output = open(dumpFileName, fmWrite, pageSize)
      for pageNum in 1..pagesTotal:
        output.write buffer
        output.flushFile
      output.close
    
    proc watchDumpFileGrow() =
      var
        bar = newProgressBar(dumpFileTargetBytes)
        currentDumpFileBytes = 0
      bar.start()
      while true:
        sleep(100)
        try:
          currentDumpFileBytes = getFileSize(dumpFileName).int
        except OSError: continue
        if currentDumpFileBytes >= dumpFileTargetBytes:
          bar.finish()
          break
        else:
          bar.set currentDumpFileBytes
    
    when isMainModule:
      prepare()
      spawn createDumpFile()
      watchDumpFileGrow()
      # Or this should also work:
      # spawn watchDumpFileGrow()
      # createDumpFile()
    
    
    
    Run

Reply via email to