2

私はこのコードを書くことを考えていました:

emit finished();
deleteLater();

finished()しかし、オブジェクトが削除される前に常に配信されるのではないかと思いました。に配信されることQt::DirectConnectionは間違いありませんがQt::QueuedConnection、 、またはスロットが別のスレッドにあるかどうかはわかりません。

4

1 に答える 1

2

シグナルを送信すると、シグナルは受信オブジェクトのスレッドのイベント キューに置かれ、処理されます。deleteLater を呼び出すとイベントもキューに追加されるため、スレッドの種類に関係なく、受信オブジェクトと削除されるオブジェクトのスレッド アフィニティが同じである場合は、順次実行されます。

送信者と受信者のスレッド アフィニティが異なる (異なるスレッドで実行されている) 場合、受信者のイベント ループが送信者のイベント ループの前に処理を開始すると、発行が終了する前に deleteLater が呼び出される可能性があると考えられます。

finished が最初に実行されることを保証したい場合は、メッセージが配信されるまで送信者のスレッドを停止するブロッキング接続で送信者と受信者を接続できます。

connect(sender, SIGNAL(finished()), receiver, SLOT(handleFinished(), Qt::BlockingQueuedConnection);

Qt::BlockingQueuedConnection を使用し、送信側と受信側のスレッド アフィニティが同じである場合、アプリケーションはデッドロックされることに注意してください。

于 2013-11-08T16:17:39.557 に答える