如何编写可以同时收听端口的多线程kivy游戏(在rasp Pi上)

时间:2016-04-29 03:55:37

标签: python multithreading raspberry-pi kivy raspbian

我正在使用kivy(输出到7“显示器)在Raspberry Pi上编写一个遥控蛇游戏。 套接字应该在游戏运行时收听端口。 然而事实证明,游戏循环和socketIO的等待循环不能一起运行。我尝试过多线程但它没有按预期工作。

socketIO代码:

df.columns = [column + 'col' for column in df.columns]

主要代码肯定不起作用:

from socketIO_client import SocketIO, BaseNamespace
class Namespace(BaseNamespace):
    def on_connect(self):
        print('[Connected]')
    def on_message(self,packet):
        print packet
        self.get_data(packet)        

    def get_data(self, packet):        
        if(type(packet) is str):
            matches = re.findall(PATTERN, packet)            
            if(matches[0][0]=='2'):                
                dataMatches = re.findall(DATAPATTERN, matches[0][4])
                print dataMatches
                ......

我尝试了以下多线程,但它不起作用:

if __name__ == '__main__':
    MyKeyboardListener() #keyboard listener, works fine
    SnakeApp().run()
    socketIO = SocketIO('10.0.0.4',8080,Namespace)
    socketIO.wait()

上面的代码导致程序中止并显示错误消息:“致命Python错误:( pygame降落伞)分段错误 中止“

我还尝试了另一种多线程方法,但它也没有用。这真令人沮丧。有没有办法让游戏循环和socketIO的等待循环同时运行?或者我只是错过了什么?

更新:main的工作代码:

if __name__ == '__main__':
    MyKeyboardListener() #keyboard listener, works fine
    threading.Thread(target = SnakeApp().run).start() #results in abort
    socketIO = SocketIO('10.0.0.4',8080,Namespace)
    socketIO.wait()

1 个答案:

答案 0 :(得分:0)

您应该在主线程中运行kivy主循环,并在辅助线程中运行套接字列表(与您的第二次尝试相反,但不起作用)。

但是当你只是关闭它时它会让你的应用程序挂起,因为尽管主线程已经死了,但是辅助线程会保持它活着。

解决此问题的最简单方法是使用daemon = True标志启动辅助线程,因此一旦主线程死亡,它就会被终止。