私がしたいこと:
- スレッドでTCPServerを実行する
- 「ソケットから受信」データを取得
- プロットを更新してデータを表示します
私が成功したこと:
- wxPythonのフレームにはボタンがあり、
- ボタンをクリックしてソケットを開始します
- ソケットからデータを受信する
問題:
TCPServerスレッドからプロット関数を呼び出そうとすると、このエラーが発生します
"PyAssertionError: C++ assertion "wxThread::IsMain()" failed at ..\..\src\common\timercmn.cpp(66) in wxTimerBase::Start(): timer can only be started from the main thread "
コード:
メイン、スレッドを開始します
def start_socket(self): HOST = '' PORT_A = 6340 self.server_A = ThreadedTCPServer((HOST, PORT_A), ThreadedTCPRequestHandler) self.server_temp = self.server_A self.server_A_thread = threading.Thread(target=self.server_A.serve_forever) self.server_A_thread.setDaemon(True) self.server_A_thread.start()
私がプロットしようとしているスレッド:
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): self.Main = Main(None, -1, '') self.data = self.request.recv(1024).strip() print "%s wrote: " % self.client_address[0] print self.data plt.ion() self.fig = plt.figure(1) print self.image_scale ax = self.fig.add_subplot(111) self.image_scale = ([1,2], [ 4,10 ] ) cax = plt.imshow(self.image_scale, cmap='Greys', interpolation='nearest' ) draw()
デバッグでは、エラーは次の行から発生します。
self.fig = plt.figure(1)
Error: "timer can only be started from the main thread"
確かではありませんが、wx.Frameのメイン関数でプロットを作成する必要があると思います。通常のプログラムを実行し続け、別のスレッドでリアルタイムにプロットできるソリューションはありますか?特に、複数のTCPServerスレッドを作成するつもりです。
よろしくお願いします。よろしくお願いします。