簡體   English   中英

睡眠會阻止整個程序(Smalltalk吱吱聲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM