1

我一直在使用 perl 进行编码,并且正在做一些计算,这些计算在很长的 for 循环中需要一些时间……循环的大小由用户给出。

所以每隔十秒左右,我想在屏幕上打印一些信息,而不使用睡眠功能,因为还有其他事情发生,我不想在睡眠功能上浪费时间。

有任何想法吗?

4

4 回答 4

2

如果你想在每五秒后长时间循环打印一些东西,你可以做这样的事情(伪代码,但你明白了):

tLast = currentTime modulo interval

for (some long loop):
  tNow = currentTime modulo interval
  if tNow < tLast:
    print "something"
  tLast = tNow
  doSomethingElse

如果循环非常紧凑并且这会增加太多开销,请执行

for (some long loop):
  tNow = currentTime modulo interval
  if tNow < tLast:
    print "something"
  tLast = tNow
  for(some tight loop):
     doSomethingElse

现在检查时间“只是每隔一段时间”发生 - 所以最紧密的循环没有开销,只有不太紧密的外循环(这本质上是我在第一个评论中提出的内容和我提出的内容的组合在以后的一个)。

于 2013-12-10T13:26:43.373 回答
1

通常这不是问题。因为你的工作有进步。依靠这个进步,你偶尔可以打印一些东西。

但是,如果您想每 10 秒精确打印一次,最好使用另一个线程每 10 秒打印一次进度给用户并sleep()运行。

您也可以直接处理时钟,即保留startTime并计算currentTime他们是否differenceInSeconds % 10 == 0打印一些东西。

于 2013-12-10T13:25:37.897 回答
1

您可以使用Smart::Comments生成进度条。

use Smart::Comments;
use Time::HiRes qw(usleep);
### process started
for my $n (0..1000000) { ### Initializing...  done
    usleep 5; #...simulate work...
}
### process ended
1;

这会产生:

### process started
Initializing..............     done                                  
于 2013-12-10T14:30:17.067 回答
1
use threads;

async {
  my $i = 0;
  LOOP: {
    print $i++, "\n";
    sleep 10;
    redo LOOP;
  }
};

# rest of program..
于 2013-12-10T13:44:46.133 回答