2016-05-03 10 views
4

さまざまなオブジェクトからアクセスするワーカースレッドを用意しましょう。このワーカーオブジェクトには公開スロットがいくつかあるため、信号をワーカーのスロットに接続する人は誰でもemitを使用してワーカースレッドの有用なタスクをトリガーできます。依存性注入と組み合わせたQtスレッドの使用目的は何ですか?

このワーカースレッドは、いくつかの異なるクラスが使用するという点で、ほぼグローバルである必要があります。その中には、アプリケーションの子の子の子である深いものもあります。

私はこれを行うには2つの主要な方法があります推測:

  1. 子クラスのすべてのメソッドは、その戻り値を経て上向きに階層を自分のメッセージを渡す、と(例えばGUI)の主を聞かせて、オブジェクトがすべての放射を扱う。

  2. ワーカースレッドのサービスを必要とするこれらのクラスはすべて、(メインクラスのメンバである)Workerオブジェクトへのポインタを持ち、コンストラクタですべてconnect()です。そのようなクラスはすべて、それ自体で発光します。基本的に、依存性注入。

オプション2は、はるかにクリーンでフレキシブルなようですが、膨大な数の接続が作成されることに心配しています。たとえば、スレッドが必要なオブジェクトの配列がある場合、配列の各要素に対して別々の接続を行います。

Qtの作成者が意図したとおり、これを行うための「正式な」方法はありますか?

+1

信号とスロットの接続をたくさん避けたい場合は、ワーカースレッドに信号を送信する新しいクラスを作成し、その新しいクラスのインスタンスを他のクラスに渡します。そうすれば、膨大な数の接続なしでオプション2を使用できます。 – thuga

+1

別の方法として、ワーカークラスをシングルトンにしてから、['QMetaObject :: invokeMethod'](http://doc.qt.io/qt-5/qmetaobject.html#invokeMethod)クラスごとにインスタンスに接続する必要はありません。 – TheDarkKnight

+0

@thuga:はい、逆参照と余分な関数呼び出しは、シグナル/スロットよりもはるかに速くなければなりません。より洗練されたソリューションに遭遇しなければ、ヘルパークラスを使用するベンチマークを行います。 – vsz

答えて

2

これには魔法の銀色の弾丸はありません。

  • なぜこれらのオブジェクトが最初にデータを放出するのですか?彼らは何かをする必要がある、つまり放出は「命令」なのか?それから別のスレッドで起こるかどうかについても心配することなく、仕事をするために何らかのサービスを呼び出すことができるかもしれません。それとも、彼らがイベントについて知らせるからですか?そのような場合には、おそらくシグナルを出すだけでシグナルを出すべきです。イベントをどのように処理するかを決めるコードを使用しています。
  • 私たちは何オブジェクトについて話していますか?いくつかのパフォーマンステストが必要です。多分それは問題ではないでしょう。
  • オブジェクトの配列がある場合、オブジェクトの目的は何ですか?おそらく、プレーンな配列を使う代わりに、ある種の "コンテナ"クラスが必要でしょうか?その後、容器は放射と接続を扱うことができ、オブジェクトはちょうどcontainer()->handle(data)のような何かをすることができます。次に、コンテナごとに1つの接続しか持たないでしょう。
+0

これは私のオリジナルの考え方とあまり変わらないが、私がこの質問をした主な理由は、Qtが私が見落としているかもしれない特別なものを提供している可能性があるということでした。(Qtスレッドを、 「QThread」をサブクラス化するのが最も簡単な方法でした) – vsz

関連する問題