如何编写可以同时监听端口的多线程 kivy 游戏(在树莓派上)

how to write a multithread kivy game(on rasp Pi) that can listen to a port at the same time

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

socketIO 代码:

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()

我尝试了以下多线程,但没有成功:

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()

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

我也试过另一种多线程方法,但效果不佳。这真是令人沮丧。有没有办法让game loop和socketIO的wait loop同时运行?或者我只是错过了什么?

更新:main 的工作代码:

def connect_socket():
    socketIO = SocketIO('10.0.0.4',8080,Namespace)
    socketIO.wait()
if __name__ == '__main__':
    MyKeyboardListener() #keyboard listener, works fine
    socketThread = threading.Thread(target = connect_socket) #creat thread for socket
    socketThread.daemon = True #set daemon flag
    socketThread.start()
    SnakeApp().run

你应该 运行 主线程中的 kivy 主循环,以及辅助线程中的套接字列表(与你第二次尝试相反,但没有成功)。

但是,当您简单地关闭它时,它会使您的应用程序挂起,因为尽管主线程已死,但辅助线程仍会使其保持活动状态。

这个问题最简单的解决方案是用daemon = True标志启动辅助线程,这样它就会在主线程死掉后立即被杀死。