Недетерминированный индикатор выполнения в командной строке Java - PullRequest
5 голосов
/ 16 февраля 2012

У меня есть консольное приложение, в котором я хотел бы поместить недетерминированный индикатор выполнения в командную строку, пока выполняются некоторые тяжелые вычисления.В настоящее время я просто распечатываю '.'для каждой итерации в цикле while, подобном следующему:

while (continueWork){
    doLotsOfWork();
    System.out.print('.');
}

, который работает, но мне было интересно, есть ли у кого-нибудь идея получше / умнее, так как это может стать немного раздражающим, если есть много итерацийчерез петлю.

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012

Вот пример, показывающий вращающийся индикатор выполнения и традиционный стиль:

import java.io.*;
public class ConsoleProgressBar {
    public static void main(String[] argv) throws Exception{
      System.out.println("Rotating progress bar");
      ProgressBarRotating pb1 = new ProgressBarRotating();
      pb1.start();
      int j = 0;
      for (int x =0 ; x < 2000 ; x++){
        // do some activities
        FileWriter fw = new FileWriter("c:/temp/x.out", true);
        fw.write(j++);
        fw.close();
      }
      pb1.showProgress = false;
      System.out.println("\nDone " + j);

      System.out.println("Traditional progress bar");
      ProgressBarTraditional pb2 = new ProgressBarTraditional();
      pb2.start();
      j = 0;
      for (int x =0 ; x < 2000 ; x++){
        // do some activities
        FileWriter fw = new FileWriter("c:/temp/x.out", true);
        fw.write(j++);
        fw.close();
      }
      pb2.showProgress = false;
      System.out.println("\nDone " + j);
    }
}

class ProgressBarRotating extends Thread {
  boolean showProgress = true;
  public void run() {
    String anim= "|/-\\";
    int x = 0;
    while (showProgress) {
      System.out.print("\r Processing " + anim.charAt(x++ % anim.length()));
      try { Thread.sleep(100); }
      catch (Exception e) {};
    }
  }
}

class ProgressBarTraditional extends Thread {
  boolean showProgress = true;
  public void run() {
    String anim  = "=====================";
    int x = 0;
    while (showProgress) {
      System.out.print("\r Processing " 
           + anim.substring(0, x++ % anim.length())
           + " "); 
      try { Thread.sleep(100); }
      catch (Exception e) {};
    }
  }
}
3 голосов
/ 16 февраля 2012

Попробуйте использовать возврат каретки, \r.

1 голос
/ 16 февраля 2012

В приложениях с графическим интерфейсом подход, как правило, представляет собой вращающийся круг или индикатор хода выполнения. Я помню много консольных приложений, использующих слеш, конвейер и дефис для создания вращающейся анимации:

\ | / - 

Вы также можете использовать прыгающий символ в скобках:

[-----*-----]

Конечно, как уже упоминалось в предыдущем ответе, вы хотите использовать return, чтобы вернуться в начало строки, а затем распечатать прогресс, перезаписав существующий вывод.

Редактировать: Многие опции кулера, упомянутые Уиллом в комментариях:

Охладители ASCII Spinners?

0 голосов
/ 16 февраля 2012

Если вы знаете, сколько работы вам нужно сделать и сколько осталось (или сделано), вы можете распечатать гистограмму в процентах, заполненную как индикатор выполнения.В зависимости от масштаба этого проекта, это может быть просто ascii или вы также можете рассмотреть возможность использования графики.

...