2016-05-10 108 views
0

我正在用gui制作N * N皇后问题。 我想让gui停止每个女王的每一次移动x秒,问题是,程序只是将所有的等待堆叠在一起,然后以一定的速度运行一切。 我在这里给代码:http://pastebin.com/s2VT0E49睡眠块整个程序(Smalltalk Squeak)

编辑: 这是我的工作区:

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 
+1

下次请尝试发布代码的相关部分和尽可能少的代码。链接到代码不被视为SO上的良好实践。同时显示您尝试解决问题的方法。 –

+0

现在@MaxLeske – Infested

+0

现在好多了。我提高了可读性。 –

回答

1

为了让您的工作空间的代码工作的延迟之前插入这样的:

World doOneCycle. 

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

请注意,这是快速和非常肮脏的黑客和而不是正确的方式来做到这一点(见我的其他答案)。延迟会阻止整个UI过程,而Morphic的要点在于,在执行代码时,您可以同时执行许多操作。

4

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

[ MyProgram run ] forkAt: Processor userBackgroundPriority. 

注意,UI过程通常运行在优先级40 #userBackgroundPriority是30.这可以确保你不能锁住UI。

5

由于您使用的是Morphic,因此您应该使用步进进行动画制作,而不是进程或延迟。在您的Morph实施step方法。这将自动重复执行。还执行stepTime来回答以毫秒为单位的间隔,例如每4秒钟有一个4000

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

请参见本教程:http://static.squeak.org/tutorials/morphic-tutorial-1.html

+0

即时通讯使用吱吱声矩形,我不会改变它的代码。在步骤thingy上,你能提供一个代码示例吗? – Infested

+0

你不能从工作区做到这一点(至少不干净)。把你的代码放在一个实际的类中(参见我添加的教程链接)。图像中有一个巨大的例子:浏览“step”的实现者。 Squeak的源代码就像通过“发件人”和“实施者”链接的超文本数据库。您选择一个消息名称,然后按cmd -n或cmd -m查看它们。 –