我一直在努力解决 Promises、Supplies 和其他并发功能,但我找不到一种简单的方法来完成我想要的事情。
我的目标是做这样的事情:
class Timer {
has $.promise;
has $.counter is default(0);
method start {
$!promise = Promise.new;
loop {
$!counter++;
self.show;
}
}
method stop {
$!promise.break;
}
method reset {
$!counter = Nil;
self.show;
}
method show {
say "timer: $!counter";
}
}
my Timer $t .= new;
$t.start;
$t.stop;
$t.reset;
Run Code Online (Sandbox Code Playgroud)
当然,这是行不通的,因为循环将运行到无穷大,并且我们永远不会继续到 $t.stop。
那么,您能否建议我如何将 Raku 并发性纳入考虑范围,以实现我想要的效果?
这将是我的基础Timer
课。它需要一个:display
参数,该参数必须是Callable
进行显示。
请注意,start
控制语句用于启动并发。在它内部,只有一个循环调用显示逻辑,直到循环条件变为假。您可以通过调用该.stop
方法来完成此操作。
class Timer {
has &.display is required;
has Bool $!running;
method start(Timer:D: --> Nil) {
$!running = True;
start {
&!display() while $!running;
}
}
method stop(Timer:D: --> Nil) {
$!running = False;
}
}
sub display() {
state $count;
print (++$count).fmt('%6d') ~ "\b" x 6;
}
my $timer = Timer.new(:&display);
$timer.start;
sleep 5;
$timer.stop;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
138 次 |
最近记录: |