2

次のコードを検討してください。

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"

ご覧のとおり、プロセスはブロックが評価されるまで(つまり、この場合は10秒後に)終了しません。

プロセスをすぐに終了する方法はありますか?また、ブロックが最初に評価される理由を誰かが知っていますか?

編集: ブロックが評価される理由がわかります。上記のコードの問題は、もちろん、プロセスがアクティブになる前にプロセスを終了しようとすることです。それでも、遅延が期限切れになるのを待ちたくない場合はどうなりますか?

4

1 に答える 1

1

送信後terminate、プロセスは一時停止されているisSuspendedため(送信して確認してください)、再開しない限り実行されません。isTerminatedプロセスをまだ開始する機会がなかったため、falseになります(isTerminated理由については、ソースコードを参照してください)。

したがって、実際には、プロセスは非アクティブであり、参照を手放すと適切にガベージコレクションされます。これは、目的にとっては「終了」と同じくらい良いはずです。

(免責事項:私はPharoではなくSqueakコードを見ていましたが、システムのこの部分はほとんど同じであるはずです)

于 2012-10-17T20:29:13.187 に答える