【发布时间】:2014-02-19 22:13:50
【问题描述】:
我不确定如何使用它。我正在使用usleep,因为我希望进度条一直运行到任务完成。假设任务是一个可以做很多其他事情的方法,当它完成时它返回 true。当它返回 true 时,我想使用 setCurrent 来完成进度条。
$progress = $this->getHelperSet()->get('progress');
$progress->start($this->output, 100);
$i = 0;
while ($i++ < 100) {
usleep(100000);
$progress->advance();
}
//do stuff and return true when it's done
if($this->doStuff()) $progress->setCurrent(100);
$progress->finish();
在文档中我不清楚这是如何工作的。如果我将我的方法放入循环中,它将运行 100 次。但是如果我把它放在循环之外,那么循环将在运行我的方法之前运行 100 次。另外,如果我把它放在 $progress->finish() 之外,我会收到一个错误,我必须 start() 进度条,这是有道理的,但是如果我把它放在finish() 里面,我会得到一个逻辑异常“你不能让进度倒退酒吧”
感谢您的帮助。示例用法会很棒。
更新: 也许这是不可能的。
让我解释一下我正在尝试做些什么来清除它。
我想在屏幕上运行一个进度条。它设置的迭代时间比 doStuff() 实际运行所需的时间长。 doStuff() 基本上是我课堂上的一种 fire() 方法,可以做很多其他事情,包括下载和复制文件。但是 doStuff() 只运行一次。我需要进度条在 doStuff() 运行的整个过程中都在运行,但是当 doStuff() 完成时,我希望能够将进度条推进到最后,或者不管它在循环中的哪个位置终止它。
我尝试将 progress->advance() 放在我的 doStuff() 方法中,但它仍然需要一个循环,因为它只前进一次。所以这就是为什么我需要 doStuff() 与进度条循环分开但能够从 doStuff() 中终止它。
【问题讨论】:
-
你不需要使用
setCurrent(),你应该在你正在处理的循环中调用advance()(我假设在doStuff()的某个地方) -
我不明白。 doStuff 不是循环。这是一个长时间运行的进程,它调用其他方法、实例化类等。但是当它运行时,我希望进度条在屏幕上运行。这就是为什么我会在我的 doStuff 完成后使用 setCurrent 将其推进到最后。
-
这就是我的意思,您需要将您的
ProgressHelper集成到您的doStuff()方法中,以便您可以在此过程中递增它,您的while循环正在推进之前的进度doStuff()方法实际上已被调用。您的doStuff()方法实际上需要很长时间才能运行它需要ProgressHelper吗? -
我现在明白了。我根本不需要循环。在 doStuff() 中的每个任务之后,只需一个回调即可推进栏
标签: php symfony console progress-bar