質問: Qtを使ったマルチスレッドでスレッド間通信を `QThread`と`SIGNAL/SLOT`を用いて実装しようと考えていました。 `SIGNAL/SLOT`を使えば threadAから発信されたSIGNALを threadBでSLOTする?ということができるのは理解できました。 ただ、`connect`する際にSINGNALの送信元を指定する必要があるため **どこからともなく送られてきた**とあるSIGNALに対してSLOTの処理をする というような処理ができないような気がします。 スレッドが2つ、3つとかならいいですが それ以上になるとそれぞれのインスタンスを持つ事に抵抗があります それを避けるにはスレッド生成時に親スレッドの方で`connect`を行う また、送信元を指定せずにSIGNALとSLOTだけを自身で紐付けして どこからか発信されたSIGNALを受信したら処理をするような動きをしたい場合 1. SIGNALの発信を行う専用のクラスを作成してシグナルの送信元はそれだけに絞る 2. もう`SIGNAL/SLOT`は捨てて、別でメッセージキューを実装する というぐらいしか思いつきませんでした。 **一般的にはどのような実装方法になるのでしょうか?** 根本的に勘違いしている部分もあるかもしれませんが 是非、回答よろしくお願いいたします。
回答: こんにちは。 signalは他のクラスへ処理を依頼した時の応答を受け取る際に使うことが多いように思います。 この場合は、処理の依頼先のクラスが当該signalをemitし、依頼元でそのsignalをconnectしておきますね。 つまり、signalはsignalを定義しているクラス自身が emit することがほとんどのように感じます。 さて、「クラスAがクラスBのsignalをemitしてはいけないのか?」は、恐らく良いだろうと予想しています。 しかし、Qtのsignal/slotの実装上ダメかもしれません。その場合はクラスBに当該signalをemitするだけの関数を設けて、それをクラスAから呼び出すことが考えられます。 後者がダメな理由はないように思います。(要求を処理する際に普通に使いますし。) > > 一般的にはどのような実装方法になるのでしょうか? > > > 任意のクラスが特定のクラスのsignalを直接emitするようなコードはあまり一般的ではない印象です。 これは応答を受け取るのではなく要求を投げる場面でしょうから、上述した後者の実装をするケースが多いだろうと思います。