Smalltalk Squeak中的Sleep

4

我正在处理 N*N 皇后问题以及它的图形用户界面。 我希望每次移动后能休眠几秒钟,以便观察者可以看到整个过程。 如何让 Smalltalk 程序休眠?

谢谢。

1个回答

6

不需要睡觉,你可以等待。

5 seconds asDelay wait.

例如,如果您选择并打印以下内容,则在打印结果(2)之前会等待5秒钟。

[
    5 seconds asDelay wait.
    1 + 1
] value

Delay类的注释解释了它的作用。

我是进程暂停一段时间的主要方法。最简单的使用方式如下:

(Delay forSeconds: 5) wait.

Delay类的实例通过响应 'wait' 消息来暂停调用者进程的执行一段时间。当创建 Delay 实例时,可以使用 forMilliseconds: 或 forSeconds: 消息指定暂停的持续时间。当前等待结束后,可以再次使用 Delay。例如,时钟进程可能会在一个一秒钟的 Delay 上重复等待。

保存图像快照时,如果存在正在进行的延迟,则在重新启动快照时恢复延迟。延迟可跨越毫秒级时钟回滚。

有关更复杂的示例,请参见 #testDelayOf:for:rect:。

更新:(基于评论)

wait 将暂停执行流程,这意味着在之前的示例中,只有在等待期间结束后,1 + 1 才会被执行(执行流程恢复)。

因此,在您的类中,您可以有...

MyBoard>>doStep
    self drawBoard.
    5 seconds asDelay wait.
    self solve.
    5 seconds asDelay wait.
    self destroyBoard.

等待功能是如何工作的?我实例化我的板并绘制它,然后我想让它等待x秒钟,开始解决问题,等待x秒钟,然后删除该板。我不确定我确切地理解了等待发生的时间以及下一个/上一个命令发生的时间。 - Ariel Pinchover
谢谢,是的,你回答了我的问题! - Ariel Pinchover
我确实看到了一些奇怪的东西,我在 solve 方法中以排列形式打印解决方案,并在 GUI 中绘制它。当我执行 draw wait solve 时,它会在开始解决问题的同时进行绘制。你有什么想法为什么会这样? - Ariel Pinchover
@Infested 也许UI循环正在不同的进程中执行?如果没有看到代码,我不知道(最好问一个带有真实代码示例的单独问题)。 - Peter Uhnak
我不太清楚应该展示哪一部分,有没有办法将代码发送给您,然后您查看并告诉我它为什么会那样? - Ariel Pinchover
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接