BlockingQueueに相当するものは、それぞれに固有のものQObject
です。QObjectのQtドキュメントには明示的に記載されていませんが(そうあるべきです!)、すべてのQObjectに対して効果的にイベントキューがあります。staticQCoreApplication::postEvent
メソッドを使用して、任意のスレッドから任意のQObjectにイベントを投稿できます。QObjectへのポインターがある限り、QObjectにイベントを投稿できます。
このタイプの信号スロット接続は、Qt::QueuedConnection
同じイベントキューを使用して内部QMetaCallEvent
イベントを送信します。これらのイベントはによってピックアップされQObject::event()
、関連するスロットへの呼び出しが発生します。制御がスレッドのイベントループに戻ると、スレッドはイベントキューを調べて、イベントをQObject::event()
メソッドに渡します。
これらの組み込みのイベントキューは、本質的にQObjectへのアクセスをシリアル化できるため、非常に便利です。したがって、同期プリミティブを追加する必要がなく、デッドロックの設定を回避できます。アドホック同期を使用すると問題が発生しますが、残念ながらJavaでさえ設計上間違っていました。このトピックに関するハーブサッターの優れた公開を参照してください:デッドロックの多くの面とクリティカルセクション内での不明なコードの呼び出しの回避。彼はこれと関連するトピックに関する他の多くの出版物を持っています、それは知識の真の宝庫です。彼はまた、優れたパフォーマンスを実現するために、実行から完了までの短くて甘い非同期アプリケーションを設計する方法についても説明しています。
シグナルスロットとイベント投稿を使用してQObjectとそれらの間の接続に基づいて設計を行う場合、プロファイリング/ベンチマークで必要性が示された場合は、これらのQObjectを専用のQThreadに移動する準備ができています。ただし、QWidgetから派生したものは、GUIスレッドを離れることはできません。