Smalltalk - Печатать что-то каждые 2 секунды

Я кодирую в Smalltalk, используя Pharo. Мой код:

|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?


person cawecoy    schedule 01.12.2012    source источник


Ответы (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
person Janko Mivšek    schedule 01.12.2012

Ответ, который дал Янко, безусловно, правильный - вы сразу разветвляли 5 процессов, все из которых ждали одни и те же 2 секунды, поэтому все они завершились в одно и то же время.

Вот еще немного пояснений:

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

Вам нужно создать только один объект Delay, так как вы хотите задерживать одинаковое количество времени на каждой итерации.

timesRepeat: чище, если вам не нужно значение индекса (to:do: чище, чем whileTrue: если вам ДЕЙСТВИТЕЛЬНО нужно значение индекса).

Наконец, если вы попытались отладить это, отправив блоку сообщение о значении вместо форка, вы увидите 10-секундную задержку, а затем будут отображаться все 5 строк. Это связано с тем, что графический интерфейс не обновляется, пока основная задача занята, в то время как вилка заставляет блок работать в фоновом режиме и позволяет обновлять графический интерфейс (в частности, расшифровку).

person Dave Mason    schedule 02.12.2012