我正在使用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线程中的变量时它会锁定。
关于原因和(如果可能的话)解决方案的任何想法?
答案 0 :(得分:3)
我无法验证您是否确实存在线程/并发问题,尽管看起来很可能。我可以建议一个可以解决它的解决方案。
python多处理模块演示了如何使用队列生成新进程(而不是线程)。如果您创建新进程然后在其中初始化OSC,并且让处理程序只是在到达时简单地在队列上放置消息,则可以从主pygame进程轮询队列以获取已经进入的任何消息。
它比你想要的要干净一点,但至少它会让两个模块在臂长,这样它们就不会相互干扰。