2011-09-03 20 views
5

私はいくつかのハードウェアを管理するためにPySideを使用しており、インターフェイスのボタンのクリックなどに応じて比較的単純な操作を実行しています。これらのハードウェアのそれぞれを実行するためのコードは別のスレッドにあります。便宜上、UIコンポーネントがPySide/PyQtで安全で怠惰なメソッド呼び出し

my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...}) 

明らかにこれは、直接、他のスレッドでの信号の属性にアクセスする....が、私は」を使用することができるように、私は一般的なinvoke_method信号を追加したものをハードウェアドライバのすべてにこれがGIL界で必ずしも大丈夫なのかどうかはわかりません。

ドライバの別の信号に接続されたUIに操作固有の信号を持たなくても、任意のスレッドで任意のメソッドを呼び出すことができます。

Iは、ハードウェアの異なる部分にアクセスUIコードの各ビットの信号を使用して代わりに想像 - do_invocation_driver_1do_invocation_driver_2ようなものを、対応するドライバのinvoke_method信号にそれらを接続します。

答えて

4

PyQt GUIを使ってインターフェイススレッドを実行する一般的な方法については、this postを読むことをお勧めします。ポストでは、ソケットI/Oを行うスレッドについて説明していますが、実際にはどのスレッドにも当てはまります。具体的には、ハードウェアインターフェイススレッドは通常I/Oも使用するため、これは適しています。

このアプローチは非常に汎用的なもので、Queue.Queueを使用しています。単純なタスクでは余計なように思えます(しかし、スレッド内で "that"関数を呼びたいだけです)。しかし、アプリケーションがいったん大きくなると、スレッド同期の問題を何も避け、非常に拡張性があるので、それを感謝します。私は個人的にすべての種類の作業を行うサイドスレッドを持つ複雑なPyQt GUIを実装するためにこれを使用しました。

関連する問題