さまざまなオブジェクトからアクセスするワーカースレッドを用意しましょう。このワーカーオブジェクトには公開スロットがいくつかあるため、信号をワーカーのスロットに接続する人は誰でもemit
を使用してワーカースレッドの有用なタスクをトリガーできます。依存性注入と組み合わせたQtスレッドの使用目的は何ですか?
このワーカースレッドは、いくつかの異なるクラスが使用するという点で、ほぼグローバルである必要があります。その中には、アプリケーションの子の子の子である深いものもあります。
私はこれを行うには2つの主要な方法があります推測:
子クラスのすべてのメソッドは、その戻り値を経て上向きに階層を自分のメッセージを渡す、と(例えばGUI)の主を聞かせて、オブジェクトがすべての放射を扱う。
ワーカースレッドのサービスを必要とするこれらのクラスはすべて、(メインクラスのメンバである)Workerオブジェクトへのポインタを持ち、コンストラクタですべて
connect()
です。そのようなクラスはすべて、それ自体で発光します。基本的に、依存性注入。
オプション2は、はるかにクリーンでフレキシブルなようですが、膨大な数の接続が作成されることに心配しています。たとえば、スレッドが必要なオブジェクトの配列がある場合、配列の各要素に対して別々の接続を行います。
Qtの作成者が意図したとおり、これを行うための「正式な」方法はありますか?
信号とスロットの接続をたくさん避けたい場合は、ワーカースレッドに信号を送信する新しいクラスを作成し、その新しいクラスのインスタンスを他のクラスに渡します。そうすれば、膨大な数の接続なしでオプション2を使用できます。 – thuga
別の方法として、ワーカークラスをシングルトンにしてから、['QMetaObject :: invokeMethod'](http://doc.qt.io/qt-5/qmetaobject.html#invokeMethod)クラスごとにインスタンスに接続する必要はありません。 – TheDarkKnight
@thuga:はい、逆参照と余分な関数呼び出しは、シグナル/スロットよりもはるかに速くなければなりません。より洗練されたソリューションに遭遇しなければ、ヘルパークラスを使用するベンチマークを行います。 – vsz