2016-04-29 8 views
0

私は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 
+0

メインスレッドでSnakeApp()、セカンダリスレッドでSockedIOを実行しようとしましたか?それでも動作しない場合は、次のようにしてください:[link](https://kivy.org/docs/faq.html#fatal-python-error-pygame-parachute-segmentation-fault) – jligeza

+0

@jligezaありがとう。まあ...それは仕事の種類。しかし、プログラムを終了する方法はありません。 ctrl + c(またはctrl + z)はプログラムをフリーズさせます。私はPiを再起動しなければなりません。 socketIOコードを取り出すと、プログラムは通常Ctrl + Cで終了することができます。これは奇妙で、マルチスレッドのものに関連している必要があります – user2829353

+0

ctrl + cでプログラムを即座に終了させる最も簡単な方法は、セカンダリスレッドの 'daemon'フラグをセットすることです。プライマリスレッドが一度終了すると、セカンダリスレッドは自動的に終了し、アプリケーション全体の実行が終了します。 – jligeza

答えて

0

あなたはプライマリスレッドでkivyメインループを実行する必要があり、かつソケットがセカンダリスレッド(動作しませんでしたあなたの2回目の試行の逆)に上場。

しかし、プライマリスレッドが停止しているにもかかわらず、セカンダリスレッドがそのスレッドを有効にしておくので、アプリケーションを閉じるだけでアプリがハングアップします。

この問題の最も簡単な解決策は、daemon = Trueフラグを使用してセカンダリスレッドを開始することです。このため、プライマリスレッドが停止するとすぐに強制終了されます。

関連する問題