2012-10-17 445 views
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" 

正如你所看到的,过程将不会终止,直到块已被评估(即,在这种情况下,在十秒钟后)。

有没有办法来立即终止一个进程? 另外:有没有人有一个想法,为什么该块首先被评估?

编辑︰ 我可以看到为什么块评估。上述代码的问题当然是我试图在它变得活跃之前终止这个过程。不过,如果我不想等待延迟过期,该怎么办?

+0

有一个“]”太多之后,第二等待 –

+0

固定的,谢谢达米安。 –

回答

1

发送terminate后,您的过程被暂停(通过发送isSuspended进行检查),因此除非恢复,否则它将不会运行。你从isTerminated得到错误,因为这个过程还没有机会开始(查看isTerminated的源代码以了解原因)。

所以其实你的程序是无效的,将是正确的垃圾收集,一旦你放手的参考,这对于你的目的应该是为“终止”一样好。

(声明:我一直在寻找在佳乐代码,而不是菲罗,但系统的这部分应该是大同小异的)

+0

有道理。 Squeak和Pharo的代码在这里似乎非常相似。如果我可以依靠GC,那么在延迟运行时终止也是可能的(延迟将被暂停)。但有一个问题:进程队列很弱?他们提到这一进程不应妨碍GC;我没有找到“ProcessorScheduler”的实例变量'quiescentProcessLists'的初始化位置。 –

+1

流程列表并不薄弱,但挂起需要这些列表的处理。那里只有可运行的进程。 'quiescentProcessLists'永远不会初始化,它在1996年甚至更早的时候初始化了一次。吱吱声总是在运行,并在操作过程中暂时暂停,方法是将其快照到磁盘并恢复。与大多数其他系统不同,它不会从头开始重新启动。 –

+0

我应该猜到了:)谢谢! –