2012-12-01 80 views
3

我使用Pharo编码Smalltalk。我的代码:Smalltalk - 每2秒打印一次东西

|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. 
] 

它打印出所有的“2秒之后”一次,而不是每2秒时:

2 seconds are up 
2 seconds are up 
2 seconds are up 
2 seconds are up 
2 seconds are up 

请,谁能告诉我如何打印的东西,每次2秒在Smalltalk?

回答

5

您一次分叉了所有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 
+0

没错。谢谢! – cawecoy

4

扬科给出的答案当然是正确的 - 你立即分叉5点的过程,所有这些都等待着相同的2秒,所以他们都在同一时间完成。

下面是详细说明一下:

[|delay| 
    delay := Delay forSeconds: 2. 
    5 timesRepeat: [ 
    delay wait. 
    Transcript crShow: '2 secs'] 
] fork 

你只需要创建一个延迟对象,因为要延迟相同的时间每次迭代。

times如果您不需要索引的值(如:do:比whileTrue更干净,如果您需要索引值),则清晰:清洁。

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

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