1

我正在使用 pygame 编写游戏。我打算使用 OpenSoundControl (OSC) 来控制其中一个角色,这是一种基于 udp 的实时通信协议。基本上我正在使用simpleOSC模块将一些 OSC 命令绑定到我的 pygame 程序上的功能。

我的游戏结构是这样的(这是一个简化,所以你明白了):

globalsomething = {}

def handler(*m):
    global globalsomething
    print "it works"
    print globalsomething
    print "not working"

if __name__ == "__main__":
    osc.init()
    osc.listen('', 3333)
    osc.bind(handler,'/game/dosmtng')
    app = Game()
    while True: 
        app.MainLoop()

Game 是一个简单的类,它执行 pygame.init() 并绘制并完成与 pygame 相关的几乎所有事情。

执行代码时遇到的问题是,当我发送一个 osc 数据包时,我得到“它可以工作”但不是“不工作”,然后没有处理后续的 osc 数据包。

由于 simpleOSC 使用线程,我对此行为的唯一解释是 pygame 使用了某种不兼容的线程(?),并且当尝试访问位于 pygame 线程中的变量时,它会锁定。

关于原因和(如果可能)解决方案的任何想法?

4

1 回答 1

3

我无法验证您是否确实存在线程/并发问题,尽管这似乎很可能。我可以建议一个可以解决它的解决方案。

python 多处理模块演示了如何使用队列生成新进程(不是线程)。如果您创建新进程,然后在其中初始化 OSC,并让处理程序在有东西到达时简单地将消息放在队列中,那么您可以从主 pygame 进程轮询队列以获取任何已进入的消息。

它比你想象的要干净一些,但至少它会让两个模块保持一定距离,这样它们就不会相互干扰。

于 2010-02-23T09:24:04.693 回答