さまざまなQt メソッド呼び出しとシグナルスロット接続タイプには、次の代替手段があります。
- 直接接続:現在のスレッドでメソッドを呼び出し、明らかにブロックしています。
- Queued connection : レシーバーのイベント ループからメソッドを呼び出し、ブロックすることはありません。
- 自動接続: ターゲット オブジェクトのスレッドでメソッドを呼び出し、現在の場合はブロックし、それ以外の場合はキューに入れ、ブロックしません。
- キュー接続のブロック: ターゲット オブジェクトのスレッドでメソッドを呼び出します。現在のスレッドでない場合はブロックし、それ以外の場合はデッドロックします。
ただし、ターゲットオブジェクトが同じスレッドに存在する場合は直接接続として機能し、そうでない場合はキュー接続をブロックする"Blocking Auto Connection" のようなものが必要です。
どのように?
参考までに、現在の解決策はこれに要約されるようです...これは明らかに良い方法ではありません。幸いなことに、それはそれほど重要ではない場所にありますが、それでも...とにかく、それについてコメントする必要はありません。これはコードレビューの質問ではありません:-)
QMetaObject::invokeMethod(target, "method", Qt::AutoConnection, ...);
// If same thread, method call is already done here and sleep is skipped
while(!target->isDone()) sleep(1);