我一直使用perl进行编码,我正在进行一些计算,这需要花费一些时间进行长时间的循环...循环的大小由用户给出。
所以在每十秒钟左右,我想在屏幕上打印一些信息,而不使用睡眠功能,因为还有其他事情发生,我不想浪费时间在睡眠功能上。
有什么想法吗?
答案 0 :(得分: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
现在对时间的检查“只是经常发生” - 所以对于最紧密的循环没有开销,只是对于不太紧的外环(这实际上是我在第一次评论中提出的组合,以及我后来提出的建议。)
答案 1 :(得分:1)
通常这不是问题。因为你的工作进展顺利。依靠这一进步,您偶尔可以打印一些东西。
但是如果你想要每10秒打印一次,最好使用另一个线程每隔10秒向用户打印一次进度并sleep()
功能。
你也可以直接处理时钟,即保持startTime
并计算currentTime
,如果他们differenceInSeconds % 10 == 0
然后打印一些东西。
答案 2 :(得分:1)
use threads;
async {
my $i = 0;
LOOP: {
print $i++, "\n";
sleep 10;
redo LOOP;
}
};
# rest of program..
答案 3 :(得分: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