5

私が取り組んでいるいくつかのソースコードを掘り下げていました。誰かがコード化した奇妙なステートメントを見つけました。ソース コードは、QML GUI を備えた GUI アプリケーションであり、QT 4.7.x を使用します。

以下のスニペットは、コア アプリケーション ロジックに属します。

// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);

オブジェクトがキュー接続を介してそれ自体に接続するのは奇妙です。これは、本質的に、オブジェクトが同時に異なるスレッドで「生きている」可能性があることを意味しますか?

一見、意味がわかりませんでした。そのような接続がもっともらしい、または必要な理由を誰か思いつくことができますか?. これでも機能しますか?

4

2 に答える 2

10

問題なく動作します。SetCurrentTaskSlot を呼び出す前に、何らかのイベント ループ処理が必要だったのではないでしょうか?

QueuedConnection は、何かが別のスレッドにあるという意味ではないことに注意してください。QueuedConnection は、シグナルが発行されたときに、対応するスロットが直接呼び出されないことのみを意味します。イベントループでキューに入れられ、制御がイベントループに戻されるときに処理されます

于 2012-06-27T15:52:33.397 に答える
3

キューに入れられた接続は、受信者がどこに住んでいるかについては何も意味しません。逆のことが当てはまります。別のスレッドに存在するオブジェクトにシグナルを安全に送信するには、キューに入れられた接続を使用する必要があります。しかし、あなたはそれらをどんなスレッドに住んでいるオブジェクトにも使うことができます!

キュー接続を使用して、直接接続の場合のように送信サイトからすぐにではなく、イベントループ内から信号が配信されるようにします。直接接続は、概念的には、リスト上の関数ポインターへの一連の呼び出しです。キュー接続は、概念的には、イベントの内容に基づいて関数呼び出しを実行できる巧妙な受信者に送信されるイベントです。

イベントは内部QMetaCallEventであり、QObject::eventこのイベントに作用して呼び出しを実行します。

于 2012-06-27T17:39:01.277 に答える