5

私は PySide を使用して一部のハードウェアを管理し、(たとえば) インターフェイスのボタンのクリックに応じて比較的単純な操作を実行しています。これらの各ハードウェアを実行するためのコードは、別のスレッドに存在します。便宜上、invoke_methodUI コンポーネントが使用できるように、これらすべてのハードウェア ドライバーに汎用シグナルを追加しました。

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

明らかに、これは他のスレッドのシグナル属性に直接アクセスします....しかし、これがGILの世界で必ずしも問題ないかどうかはわかりません。

これが本当に怠惰な解決策である場合、UI で操作固有のシグナルをドライバーの別のシグナルに接続することなく、任意のスレッドで任意のメソッドを呼び出すための優れた代替手段はありますか?

do_invocation_driver_1代わりに、さまざまdo_invocation_driver_2なハードウェアにアクセスする UI コードの各ビットでシグナルを使用することを想像できますinvoke_method

4

1 に答える 1

4

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

説明したアプローチは非常に一般的で、 を使用してQueue.Queueおり、単純なタスクにはやり過ぎのように思えるかもしれません (ただし、スレッドで「その」関数を呼び出したいだけです)。ただし、アプリケーションが自明ではなくなった場合は、スレッド同期の問題がまったく回避され、非常にスケーラブルであるため、その価値が高く評価されます。私は個人的にそれを使用して、あらゆる種類のことを行うサイドスレッドを備えた複雑な PyQt GUI を実装しました。

于 2011-09-03T05:41:49.360 に答える