在Pharo v3等待

时间:2014-12-11 03:34:13

标签: multithreading smalltalk pharo

我想实现一个名为Piece>>userMovesFor:seconds的方法,它在“秒”时间内取出键盘输入并依赖于它,向现有对象发送一些msgs以使它们进行一些计算(我的意思是它们不会分支未来的执行流程。)

因此,根据我对系统的了解,我认为该方法可能是这样的示意图。

Piece>>userMovesFor:seconds
| keyboardInterfacer |
keyboardInterfacer:=KeystrokeInterpreter on:self.
keyboardInterfacer takeKeyboardFocus .
self sleep:40 seconds.
keyboardInterfacer releaseKeyboardFocus .

KeystrokeInterpreter将是Morph的子类。在获得焦点的同时,它将通过Morph>>handleKeystroke来处理击键。

Piece>>sleep:seconds只会等待“秒”时间。

因此,在执行的某个时刻,Piece实例将在Morph实例处理键盘输入时无所事事。

我的问题是两个。

1)有没有办法实现Piece>>sleep这样不会导致系统冻结(所以KeystrokeInterpreter实例可以完成他的工作)?

我已尝试使用Duration>>wait并自行实现自我调用等待消息,但两种选择都会冻结图像中所有对象的执行。

2)是否有更好的方法来实现Piece>>userMovesFor

3 个答案:

答案 0 :(得分:3)

按键之间40秒似乎很长时间:)我之前没有考虑过键处理,但这让我感兴趣所以我戳了一下。也许你正在寻找这样的东西......

Morph subclass: #Piece
    instanceVariableNames: ''
    classVariableNames: ''
    category: 'Play'

Piece>>initialize 
    super initialize.
    self extent: 200@200.
    "Piece new openInWorld"

Piece>>handlesMouseOver: evt
    ^true

Piece>>mouseEnter: event
    super mouseEnter: event.
    self color: Color yellow.
    self takeKeyboardFocus.

Piece>>mouseLeave: event
    super mouseEnter: event.
    self color: Color blue.

Piece>>handlesKeyboard: evt
    ^true

Piece>>keyStroke: event
    event keyCharacter == $r ifTrue:[ self color: Color red ].
    event keyCharacter == $g ifTrue:[ self color: Color green ].
    event keyCharacter == $x ifTrue:[ self delete ].
    event keyCharacter == $c ifTrue: 
    [ 
        [   self inform: 'Starting compute without blocking the UI'.
            (Delay forSeconds: 10) wait. "simulate work"
            self inform: 'Here are the results'.
        ] fork. 
    ].

有关更多信息...通过在Image中搜索上面实现的方法的发件人,了解其他人如何做到这一点。如果您喜欢冒险,请在其中一些实施中“自行停止”,然后使用“系统>启用暂停/检查一次”。

可以找到另一个搜索谷歌搜索“[Pharo-users]示例自定义鼠标事件”的帖子 http://lists.pharo.org/pipermail/pharo-users_lists.pharo.org/2014-August/013156.htm

答案 1 :(得分:2)

由于您使用Morphic,#step将是您最好的选择。你可以在你的Morph上实现它,以及#stepTime(多久一次)。只要你的变形在世界上是开放的,步骤将继续射击。可能最简单的方法是跟踪Morph中的超时并从Piece提供回调以传回控制权。

答案 2 :(得分:1)

添加到肖恩的想法,请确保你看看Morph>> startStepping以及Morph中的整个步进和演示者协议。

stepping and presenter protocol

我要做的是避免耦合键盘输入和变形。

只需拥有变形步骤并独立阅读键盘事件。从那里,创建片断正在收听的公告。

将您的游戏用作播音员。

所以,你不是在处理击键而是与游戏相关的真实事件。

HTH