睡眠会阻塞整个程序(Smalltalk Squeak)

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

您暂停的进程是您的程序 运行 所在的进程。该进程也恰好是 UI 进程。所以当你暂停你的程序时,你也暂停了 UI ,因此 UI 元素永远没有机会更新自己。在单独的进程中尝试 运行 您的程序:

[ MyProgram run ] forkAt: Processor userBackgroundPriority.

请注意,UI 进程通常以 40 的优先级运行。#userBackgroundPriority 是 30。这确保您无法锁定 UI。

由于您使用的是 Morphic,因此您应该对动画使用 stepping,而不是处理或延迟。在您的 Morph 中实施一个 step 方法。这将自动重复执行。还实现 stepTime 以毫秒为单位回答间隔,例如4000 每 4 秒。

在 step 方法中,计算你的新状态。如果每个皇后都被建模为一个单独的 Morph,而您只需移动位置,Morphic 就会负责更新屏幕。如果您有自己的 drawOn: 方法,则在您的 step 方法中调用 self changed,以便 Morphic 稍后调用您的绘图代码。

查看本教程:http://static.squeak.org/tutorials/morphic-tutorial-1.html

要使您的工作区代码正常工作,请在延迟之前插入:

World doOneCycle.

这将导致 Morphic 世界重新显示。

请注意,这是一种快速但非常肮脏的破解方法,不是正确的方法(请参阅我的其他答案)。延迟会阻塞整个 UI 过程,而 Morphic 的全部意义在于您可以在代码执行时同时做很多事情。