Pygame和线程:在访问全局变量时被锁定?

2024-10-03 17:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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相关的事情。在

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

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

关于原因和(如果可能的话)解决办法有什么想法吗?在


Tags: gameapp游戏角色编程数据包线程pygame
1条回答
网友
1楼 · 发布于 2024-10-03 17:26:28

我无法验证您是否真的存在线程/并发问题,尽管看起来很有可能。我可以提出一个解决办法。在

python多处理模块演示如何使用队列生成新进程(而不是线程)。如果您创建新进程,然后在其中初始化OSC,并且让处理程序在某个消息到达时将一条消息放入队列,那么您就可以从pygame主进程轮询队列,以获取传入的任何消息。在

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

相关问题 更多 >