私のコードでは、ワーカー スレッドが gui スレッドにシグナルを送信します。Signal と Slot は Qt::BlockingQueuedConnection 経由で接続されます。
closeEvent
アプリケーションがワーカー スレッドを停止しようとしていて、イベントが終了したとき。
ワーカー スレッドの関数を呼び出します。
void stop() {
_isFinished = true;
wait();
}
次に、ワーカー スレッドが_isFinished
状態をチェックし、設定されていない場合はシグナルを送信します。
次の状況をイメージする
The worker Gui Thread
================= =================
if (!_isFinished) -----------------
----------------- _isFinished = true;
----------------- wait();
emit mySignal(); -----------------
明らかに、両方のスレッドがロックされます (デッドロック)。
ミューテックスを追加すると、別のデッドロック状況を見つけることができます。ワーカーがミューテックスをロックすると、GUI スレッドがブロックされます。その結果、送信されたシグナルによってワーカーがロックされます。
どうすればこれに対処できますか?