1

私は wxPython をデータ取得システムのフロント エンドとして使用しています。バックエンドは PyDAQmx を使用して国立機器カードに接続しています。

データを収集するためにループが呼び出されると、明らかに gui がブロックされるため、threading.Thread を使用して取得モジュールを別のスレッドに配置します。ただし、データが非常に高速に入力されるため、実際には複数のコアが必要になります。これは、threading.Thread では実行できないと思います。

次に、 multiprocessing.Process & Queue を使用して別のプロセスを生成して、データを報告することを試みました。

captureProcess = Process(target=acquire, args=(self.settings, self.queue,))
captureProcess.start()

データはキューに送信されます

queue.put( (i, j, c, aiData.value) )

そして再び拾った

(scan, interval, count, ai) = queue.get()

ここで奇妙な点は、メインの wx.Frame でいくつかの pyplot グラフを更新できるという意味で GUI がブロックされないことですが、それとのやり取り (メニューをクリックするなど) を行うと、すぐにプログラムが応答しなくなり、クラッシュします。 . これがなぜなのか、または回避策を知っている人はいますか?

助けてくれて本当にありがとうございます。Windows 7でアナコンダを使用しています。

4

1 に答える 1

1

スレッド内で GUI との対話がないこと、または GUI でスレッドと直接対話しないことを絶対に確認してください。GUI は、スレッドが定期的にチェックするメンバー値を変更するスレッド内のセッター関数を呼び出すことができ、スレッドは追加データを使用してイベントをポストすることによって GUI の結果を引き起こすことができます。

wxPython の優れた機能の 1 つは、カスタム イベントが任意のタイプのデータを運ぶことができることです。

Queue の機能の 1 つは、スロットがいっぱいになるとハングし、GUI がメニュー クリックなどの操作を行っている間はキューにサービスを提供しないということです。データを破棄してデータ損失フラグを設定するようなものです。

于 2013-07-30T19:32:59.167 に答える