[英]Sleep blocks whole program (Smalltalk Squeak)
我正在用gui做一個N * N皇后問題。 我想讓gui停止每個女王/王后的動作x秒鍾,問題是,該程序只是將所有等待堆疊在一起,然后快速運行所有內容。 我在這里提供代碼: http : //pastebin.com/s2VT0E49
編輯:這是我的工作區:
board := MyBoard new initializeWithStart: 8.
Transcript show:'something'.
3 seconds asDelay wait.
board solve.
3 seconds asDelay wait.
board closeBoard.
這是我希望等待的地方
canAttack: testRow x: testColumn
| columnDifference squareMark |
columnDifference := testColumn - column.
((row = testRow
or: [row + columnDifference = testRow])
or: [row - columnDifference = testRow]) ifTrue: [
squareDraw := squareDraw
color: Color red.
0.2 seconds asDelay wait.
^ true ].
squareDraw := squareDraw color: Color black.
^ neighbor canAttack: testRow x: testColumn
由於您使用的是Morphic,因此應該對動畫使用步進 ,而不是處理或延遲。 在您的Morph
實現一個step
方法。 這將自動重復執行。 還要實現stepTime
以毫秒為單位回答間隔,例如,每4秒4000
。
在step方法中,計算您的新狀態。 如果將每個女王/王后建模為一個單獨的Morph,而您只是移動位置,則Morphic將負責更新屏幕。 如果您有自己的drawOn:
方法,請在step
方法中調用self changed
drawOn:
以便Morphic稍后調用您的繪圖代碼。
參見本教程: http : //static.squeak.org/tutorials/morphic-tutorial-1.html
您要掛起的進程就是您的程序正在運行的進程。該進程也恰好是UI進程。 因此,當您掛起程序時,您也會掛起UI,因此UI元素永遠無法獲得自我更新的機會。 嘗試在單獨的過程中運行程序:
[ MyProgram run ] forkAt: Processor userBackgroundPriority.
請注意,UI進程通常以40為優先級運行。 #userBackgroundPriority
為30。這確保您不能鎖定UI。
為了使您的工作區代碼正常工作,請在延遲之前插入以下代碼:
World doOneCycle.
這將導致重新顯示“變形”世界。
請注意,這是快速且非常骯臟的hack,而不是正確的方法(請參閱我的其他答案)。 延遲會阻止整個UI流程,而Morphic的重點是您可以在代碼執行時同時執行許多操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.