进度条

编辑本页

进度条

当执行长时间运行的命令时,显示进度信息可能会很有帮助,它会随着命令的运行而更新:

要显示进度详细信息,请使用ProgressBar,向它传递一个总单元数,并在命令执行时推进进度:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用ob娱乐下载\组件\控制台\助手\ProgressBar//创建一个新的进度条(50个单元)progressBarProgressBar (输出50);//启动并显示进度条progressBar->开始();0++ <50) {/ /……做一些工作//将进度条前进1个单位progressBar->提前();//你也可以将进度条提前1个单位以上/ / progressBar - >进步(3);//确保进度条在100%progressBar->完成();

提示

你也可以返回进度条(即后退一步)通过调用进步- >提前()带一个负值。例如,如果你打电话进步- >进步(2)然后它将进度条后退2步。

而不是通过一些步骤(使用提前()方法),还可以通过调用setProgress ()方法。

提示

如果您的平台不支持ANSI代码,则进度条的更新将作为新行添加。要防止输出被淹没,请使用minSecondsBetweenRedraws ()方法来限制重绘制的数量setRedrawFrequency ()方法重新绘制每N次迭代。默认情况下,重绘频率为100毫秒10%你的马克斯

如果您事先不知道确切的步数,请将其设置为合理的值,然后调用setMaxSteps ()方法来根据需要更新它:

1 2 3 4 5
//以50个单元的进度条开始progressBarProgressBar (输出50);//一个复杂的任务被创建了:将进度条增加到200个单位progressBar->setMaxSteps (200);

类时省略steps参数是另一种解决方案ProgressBar实例:

1
progressBarProgressBar (输出);

然后进度将显示为一个悸动:

1 2 3 4 5 6 7 8 9
#没有马克斯步骤(显示像throbber) 0  [>---------------------------] 5  [----->----------------------] 5  [============================] # 马克斯步骤定义0/3  [>---------------------------] 0%的1/3  [=========>------------------] 33% 3/3  [============================] 100%

不管你什么时候完成任务,别忘了打电话完成()以确保进度条显示以100%的完成率刷新。

请注意

如果您希望在进度条运行时输出某些内容,请调用clear ()第一。完成后,打电话给我显示()再次显示进度条。

如果进度信息存储在可迭代变量(例如数组或PHP生成器)中,则可以使用迭代()方法,自动启动、前进和结束进度条:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\控制台\助手\ProgressBarprogressBarProgressBar (输出);// $iterable可以是array可迭代的= (12];foreachprogressBar->迭代(可迭代的作为价值) {/ /……做一些工作//或一个生成器函数可迭代的()收益率1收益率2;...};foreachprogressBar->迭代(iterable ())作为价值) {/ /……做一些工作

前面的代码将输出:

1 2 3
0/2  [>---------------------------] 0%的1/2  [==============>-------------] 50% 2/2  [============================] 100%

自定义进度条

内置的格式

类的当前详细程度决定了进度条上呈现的信息OutputInterface实例:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# OutputInterface: VERBOSITY_NORMAL 0/3 (CLI没有冗长的标志)  [>---------------------------] 0%的1/3  [=========>------------------] 33% 3/3  [============================] 100% # OutputInterface:: VERBOSITY_VERBOSE 0/3 (- v)  [>---------------------------] 0% 1秒的1/3  [=========>------------------] 33% 1秒3/3  [============================] 100% 1秒# OutputInterface:: VERBOSITY_VERY_VERBOSE 0/3 (vv)  [>---------------------------] 1秒/ 1秒1/3的0%  [=========>------------------] 33% 1秒/ 1秒3/3  [============================] 100% 1秒/ 1秒# OutputInterface: VERBOSITY_DEBUG 0/3 (-vvv)  [>---------------------------] 0% 1秒/ 1秒1.0 MB的1/3  [=========>------------------] 1秒/ 1秒1.0 MB 3/3 33%  [============================] 100% 1秒/ 1秒1.0 MB

请注意

如果调用带有quiet标志的命令(q),进度条将不会显示。

与其依赖当前命令的详细模式,还可以强制使用via格式setFormat ()

1
progressBar->setFormat (“详细”);

内置格式如下:

  • 正常的
  • 详细的
  • very_verbose
  • 调试

如果未为进度条设置步骤数,请使用_nomax变体:

  • normal_nomax
  • verbose_nomax
  • very_verbose_nomax
  • debug_nomax

自定义格式

除了使用内置格式,你还可以设置自己的格式:

1
progressBar->setFormat (“%酒吧%”);

设置格式为只显示进度条本身:

1 2 3
>--------------------------- =========>------------------ ============================

进度条格式是包含特定占位符的字符串(名称用字符);占位符将根据进度条的当前进度进行替换。下面是内置占位符的列表:

  • 当前的:当前步长;
  • 马克斯:最大步数(如果没有定义max,则为0);
  • 酒吧:酒吧本身;
  • 百分比:完成百分比(如果没有定义最大值,则不可用);
  • 运行:进度条开始后经过的时间;
  • 剩下的:完成任务的剩余时间(如果没有定义最大值则不可用);
  • 估计:完成任务的估计时间(如果没有定义最大值则不可用);
  • 内存:当前内存使用量;
  • 消息:用于在进度条中显示任意消息(稍后解释)。

例如,下面是如何将格式设置为与调试一:

1
progressBar->setFormat (' %电流最大% / % %(%酒吧%)% %:3 s % % %时间:6 s % / %估计:6 s % %记忆:6 s %’);

注意到: 6部分添加到一些占位符?这就是如何调整栏的外观(格式和对齐)。冒号后面的部分()用于设置sprintf字符串的格式。

除了为进度条的给定实例设置格式,你还可以定义全局格式:

1 2 3 4
ProgressBar::setFormatDefinition (“最低”的进展:% % % %);progressBarProgressBar (输出3.);progressBar->setFormat (“最低”);

这段代码定义了一个new最小的格式,然后您可以使用您的进度条:

1 2 3
进度:0%进度:33%进度:100%

提示

重新定义内置格式几乎总是比创建新格式更好,因为这样可以根据命令的详细标志自动改变显示。

在定义包含仅在已知最大步数时可用的占位符的新样式时,您应该创建一个_nomax变体:

1 2 3 4 5
ProgressBar::setFormatDefinition (“最低”“剩下的% % % % % %”);ProgressBar::setFormatDefinition (“minimal_nomax”% % % %的);progressBarProgressBar (输出);progressBar->setFormat (“最低”);

显示进度条时,格式将自动设置为minimal_nomax如果该栏没有像上面的例子中那样的最大步数。

提示

格式可以包含任何有效的ANSI代码,也可以使用symfony特定的方式来设置颜色:ob娱乐下载

1 2 3 4
ProgressBar::setFormatDefinition (“最低”' <信息> % % % > < /信息\ [32 m % 033 \ 033 [0 < fg =白色;bg =蓝色>剩下% % < / > ');

请注意

格式可以跨越多行;当您希望在进度条旁边显示更多上下文信息时,这是非常有用的(请参阅本文开头的示例)。

栏设置

在占位符中,酒吧有点特殊,因为用于显示它的所有字符都可以自定义:

1 2 3 4 5 6 7 8 9 10 11
//酒吧完成的部分progressBar->setBarCharacter (“<评论> = > < /评论”);//酒吧未完成的部分progressBar->setEmptyBarCharacter (' ');//进度字符progressBar->setProgressCharacter (“|”);//条宽度progressBar->setBarWidth (50);

谨慎

出于性能考虑,Symfony每100毫秒重绘一次屏ob娱乐下载幕。如果这对您的应用程序来说太快或太慢,请使用这些方法minSecondsBetweenRedraws ()而且maxSecondsBetweenRedraws ()

12 3 4 5 6 7 8 9 10 11 12 13 14 15
progressBarProgressBar (输出50000);progressBar->开始();//每100次重新绘制一次屏幕,但是设置了额外的限制://重绘速度不低于200ms(0.2)或超过100ms (0.1)progressBar->setRedrawFrequency (One hundred.);progressBar->maxSecondsBetweenRedraws (0.2);progressBar->minSecondsBetweenRedraws (0.1);0++ <50000) {/ /……做一些工作progressBar->提前();}

自定义占位符

如果您希望显示一些依赖于进度条显示的信息,而这些信息在内置占位符列表中不可用,您可以创建自己的信息。让我们看看如何创建remaining_steps显示剩余步骤数的占位符:

1 2 3 4 5 6
ProgressBar::setPlaceholderFormatterDefinition (“remaining_steps”函数(ProgressBarprogressBar, OutputInterface输出返回progressBar->getMaxSteps () -progressBar->getProgress ();});

自定义消息

进度条定义了一个占位符消息显示任意消息。然而,没有任何内置格式包括占位符,所以在显示这些消息之前,你必须定义自己的自定义格式:

1 2 3 4
ProgressBar::setFormatDefinition (“自定义”' %当前%/%最大%——%消息%');progressBarProgressBar (输出One hundred.);progressBar->setFormat (“自定义”);

现在,使用setMessage ()属性的值%消息%显示进度条前的占位符:

1 2 3 4 5 6 7 8
/ /……progressBar->setMessage (“开始”);progressBar->开始();// 0/100——启动progressBar->setMessage (“任务正在进行中……”);progressBar->提前();// 1/100——任务正在进行中…

消息也可以与自定义占位符组合。在本例中,进度条使用%消息%而且%文件名%占位符:

1 2 3 4
ProgressBar::setFormatDefinition (“自定义”' %当前%/%最大%——%消息%(%文件名%)');progressBarProgressBar (输出One hundred.);progressBar->setFormat (“自定义”);

setMessage ()方法接受第二个可选参数来设置自定义占位符的值:

1 2 3 4 5 6 7 8
/ /……// $files = ['client-001/invoices.xml', '…'];foreach文件作为文件名) {progressBar->setMessage (“进口发票…”);progressBar->setMessage (文件名“文件名”);progressBar->提前();// 2/100——进口发票…(客户端- 001 / invoices.xml)

显示多个进度条

当使用控制台输出部分可以同时显示多个进度条,并独立更改它们的进度:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
section1输出->节();section2输出->节();progress1ProgressBar (section1);progress2ProgressBar (section2);progress1->开始(One hundred.);progress2->开始(One hundred.);0(+ +<One hundred.) {progress1->提前();如果2= = =0) {progress2->推进(4);} usleep (50000);}

经过几次迭代后,终端中的输出将如下所示:

1 2
34/100  [=========>------------------] 34%的68/100  [===================>--------] 68%
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
控制台组件支持通过Les-Tilleuls.coop