我正在使用kivy(输出到7“显示)在Raspberry Pi上编写一个远程控制蛇游戏。游戏运行时,套接字应该会监听端口。然而,事实证明,游戏循环和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
......main的代码肯定不起作用:
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错误:(游戏降落伞)分段错误中止”。
我还尝试了另一种多线程方法,但它也没有起作用。这真是令人沮丧。有没有办法让游戏循环和socketIO的等待循环同时运行?还是我漏掉了什么?
更新: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发布于 2016-04-29 10:06:54
您应该在主线程中运行kivy主循环,在辅助线程中运行套接字列表(与您的第二次尝试相反)。
但是当你简单地关闭它时,它会让你的应用程序挂起,因为尽管主线程已经死了,次线程仍然会保持它的活力。
这个问题的最简单的解决方案是使用daemon = True标志启动二级线程,这样主线程死后它就会被杀死。
https://stackoverflow.com/questions/36929270
复制相似问题