2012-10-17 271 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

我應該猜到了:)謝謝! –