web-dev-qa-db-ja.com

GUIアプリケーションの作成方法の概念を理解していない

主に重いデータのマイニングと分析を扱うプログラムを作成しています。これは主にバックエンドタイプのアルゴリズムであり、実行時にGUI要素やコンソールウィンドウは表示されません。ただし、場合によっては、何かをグラフ化したり、ユーザーから非常に特殊な入力を受け取ったりする必要があります。しかし、私は最初はGUIを統合したアプリケーションに構築したくありませんでした。代わりに、アルゴリズムをGUI要素から分離したいと思っていました。必要な場合は、それらを生成し、それらを生成してから終了します。これらは基本プログラムへの追加であり、機能するために必要ではありません。

したがって、論理的な結論は、データ処理をメインスレッドで実行し、必要に応じてGUIが別のスレッドを占有することです。なぜ2つのスレッドが必要なのですか? GUIではイベントループを実行する必要があるため、すべてがチェックされたままになります。

私がこのタスクのために選んだ特定のグラフ作成/ GUIユーティリティはPyQt5ですが、それはポイントのほかにあるはずです(それらのほとんどは同じ基本的なメカニズムを持っています)。

しかし、GUI要素は非メインスレッド( ここを参照 )で実行されることを好まないことがわかりました。 ここで見ることができます のように可能ですが、メインスレッドとセカンダリスレッドからの通信は厄介です。 GUIオブジェクトのメソッドと実際にやり取りする必要があるので、情報を渡す必要はありません。別のスレッドから実際のGUIウィジェット操作を行う必要はありません。GUIオブジェクトに属する非GUIメソッドにアクセスするだけです。

これは一般的な設計である必要がありますが、実装方法はわかりません。 「データ処理」セクションと言うときは、それよりもはるかに複雑であることを覚えておいてください。したがって、その周りにGUIを構築し、信号とスロットの内部ですべての処理を行うと、大混乱に陥るようです。

ここに一般的な質問があります。コードではなく、一般的なポインタを探しています。

  1. このようなプログラムをどのように設計しますか?

  2. 各スレッドはどのように見えますか?

  3. GUIを怒らせない方法でそれらはどのように相互作用しますか?

3
Nick Pandolfi

まず最初に。最近のOSやプログラミング言語でさえ、メインスレッドからGUI onlyを操作できます。多くの理由で、これは絶対に必要なことであり、実際にはほとんどオプションではありません。

次に、設計パターンに基づいてアプリケーションを開発することで、説明している懸念が解決されます。ここでは、最も一般的なMVP、MVC、およびMVVMパターンを使用した多くのアプローチがあります。これらはすべて、モデル(データのフェッチと操作)を、何をどのようにユーザーに提示するかから分離することを可能にします。

1
John Kouraklis

いくつかのアプローチが可能であり、マルチスレッディングでGUI /計算を正しく行うには、「プログラマー」に関するここのいくつかの段落があなたに教えることができる以上のものが必要です。

ただし、私がここで通常尋ねる最初のことは、次のとおりです。本当にマルチスレッドが必要ですか?あなたは主に重いデータのマイニングと分析を扱うプログラムを書いているので、利用可能なデータベースがあると思います。データマイニングプログラムはGUIなしで1つのプロセスで実行でき、GUIプログラムは別のプロセスで実行できます。プロセス間通信は、DBを使用して行われる場合があります。そうすれば、GUIでのマルチスレッドの必要性をまったく回避できる可能性があります。

こうすることで、処理部分とGUI部分の間に強い分離を保つことができ、処理部分が信号/スロットのメカニズムと混ざり合うことはなく、Python = GUIパーツ用(ただし、気に入った場合は引き続き使用できます。)

2
Doc Brown