我正在编写一个使用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包时,我得到的是"It works“而不是"not work”,然后没有后续的osc包被处理。
由于simpleOSC使用线程,我对此行为的唯一解释是pygame使用了某种不兼容的线程(?)当试图访问pygame线程中的变量时,它会被锁定。
对于原因和(如果可能的)解决方案有什么想法吗?
发布于 2010-02-23 17:24:05
我不能验证你是否真的有线程/并发问题,尽管看起来很有可能。我可以提出一个可能解决这个问题的解决方案。
python多处理模块演示了如何使用队列生成新进程(而不是线程)。如果您创建了新的进程,然后在其中初始化OSC,并且让处理程序在任何时候有东西到达时简单地将消息放在队列上,那么您就可以从主pygame进程轮询队列,以获取传入的任何消息。
它可能比你想的要干净一点,但至少它会让两个模块保持一定的距离,这样它们就不会相互干扰。
https://stackoverflow.com/questions/2310728
复制相似问题