如何编写可以同时监听端口的多线程 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
标志启动辅助线程,这样它就会在主线程死掉后立即被杀死。
我正在 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
标志启动辅助线程,这样它就会在主线程死掉后立即被杀死。