睡眠会阻塞整个程序(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 的全部意义在于您可以在代码执行时同时做很多事情。
我正在用 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 的全部意义在于您可以在代码执行时同时做很多事情。