Loops Smalltalk-每2秒钟打印一次

Loops Smalltalk-每2秒钟打印一次,loops,delay,smalltalk,pharo,Loops,Delay,Smalltalk,Pharo,我在用Pharo编写Smalltalk代码。我的代码: |i delay| i := 0. [i < 5] whileTrue: [ [ delay := Delay forSeconds: 2. delay wait. Transcript show: '2 seconds are up'. Transcript cr. ] fork. i := i + 1. ] 请问,有谁能告诉我如何在Small

我在用Pharo编写Smalltalk代码。我的代码:

|i delay|
i := 0.
[i < 5] whileTrue: [
    [
        delay := Delay forSeconds: 2.
        delay wait.
        Transcript show: '2 seconds are up'.
        Transcript cr.
    ] fork.
    i := i + 1.
]

请问,有谁能告诉我如何在Smalltalk中每2秒打印一次内容吗?

您一次完成了所有5个进程,以便所有5个延迟同时结束。要从后台每隔2秒打印一次,请在单独的过程中进行一个完整的循环:

|i delay|
[   
    i := 0.
    [i < 5] whileTrue: [
        delay := Delay forSeconds: 2.
        delay wait.
        Transcript show: '2 seconds are up'.
        Transcript cr.
        i := i + 1]
] fork
|我延迟|
[   
i:=0。
[i<5]尽管如此:[
延迟:=延迟秒数:2。
延迟等待。
成绩单显示:“2秒结束”。
转录本。
i:=i+1]
]叉子

Janko给出的答案肯定是正确的-您立即完成了5个进程,所有进程都等待了相同的2秒钟,因此它们都在同一时间完成

这里有更多的解释:

[|delay|
  delay := Delay forSeconds: 2.
  5 timesRepeat: [
     delay wait.
     Transcript crShow: '2 secs']
] fork
您只需要创建一个延迟对象,因为您希望在每次迭代中延迟相同的时间量

如果不需要索引值,则timesRepeat:更干净(如果确实需要索引值,则to:do:更干净)

最后,如果您尝试通过向块发送一条值消息而不是fork来调试它,您将看到10秒的延迟,然后将显示所有5行。这是因为GUI在前台任务繁忙时不会更新,而fork会导致块在后台运行,并允许GUI(尤其是脚本)更新

[5 timesRepeat: [
    (Delay forSeconds: 2) wait.
     Transcript crShow: '2 secs'] .
] fork
[5 timesRepeat: [
    (Delay forSeconds: 2) wait.
     Transcript crShow: '2 secs'] .
] fork