私はkivy(7インチディスプレイへの出力)を使ってラズベリーパイのリモートコントロールスネークゲームを書いています。 ソケットがゲームの実行中にポートを聴くことになっています ゲームループとsocketIOの待機ループが一緒に実行できないことが判明しました。同時にポートを聞くことができるマルチスレッドKivyゲーム(ラスプPi)を書く方法
:間違いなく動作していないことをメインのため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のパラシュート)セグメンテーションフォールト 中止 "
また、別のマルチスレッド方法を試しましたが、うまくいきませんでした。これは本当にイライラしています。ゲームループとsocketIOの待機ループを同時に実行させる方法はありますか?または私は何かを逃した?
UPDATE:メインの作業コード:
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
メインスレッドでSnakeApp()、セカンダリスレッドでSockedIOを実行しようとしましたか?それでも動作しない場合は、次のようにしてください:[link](https://kivy.org/docs/faq.html#fatal-python-error-pygame-parachute-segmentation-fault) – jligeza
@jligezaありがとう。まあ...それは仕事の種類。しかし、プログラムを終了する方法はありません。 ctrl + c(またはctrl + z)はプログラムをフリーズさせます。私はPiを再起動しなければなりません。 socketIOコードを取り出すと、プログラムは通常Ctrl + Cで終了することができます。これは奇妙で、マルチスレッドのものに関連している必要があります – user2829353
ctrl + cでプログラムを即座に終了させる最も簡単な方法は、セカンダリスレッドの 'daemon'フラグをセットすることです。プライマリスレッドが一度終了すると、セカンダリスレッドは自動的に終了し、アプリケーション全体の実行が終了します。 – jligeza