Немедленно прекратить процесс

Рассмотрим следующий код:

process := [ (Delay forSeconds: 10) wait ] 
    forkAt: Processor userBackgroundPriority.
process terminate.
process isTerminated. "--> false"
process resume. "process has been suspended but not terminated"
(Delay forSeconds: 10) wait.
process isTerminated "--> true"

Как видите, процесс не завершится, пока блок не будет оценен (то есть через десять секунд в этом случае).

Есть ли способ немедленно прекратить процесс? Также: у кого-нибудь есть идея, почему блок оценивается в первую очередь?

Изменить: я понимаю, почему блок оценивается. Проблема с приведенным выше кодом, конечно, в том, что я пытаюсь завершить процесс до того, как он станет активным. Тем не менее, что, если я не хочу ждать истечения задержки?

1 ответ

Решение

После отправки terminate Ваш процесс приостановлен (проверьте, отправив isSuspended) так что он не запустится, пока не возобновится. Вы получаете ложь от isTerminated потому что процесс еще не был запущен (посмотрите исходный код для isTerminated чтобы понять почему).

Таким образом, на самом деле ваш процесс неактивен и будет должным образом собирать мусор, как только вы отпустите ссылку, которая для ваших целей должна быть такой же, как и "прекращена".

(Отказ от ответственности: я искал код Squeak, а не Pharo, но эта часть системы должна быть почти такой же)

Другие вопросы по тегам