2

スロット処理から QObject を削除すると、キューに入れられた他のイベントが発生する可能性があるため、アプリがクラッシュする可能性があることを知っています。したがって、「delete obj」を使用する代わりに、obj->deleteLater() を使用します。私の知る限り、obj はキューに入れられたすべてのイベントを処理するのを待ってから、「obj を削除」します。

QObject::~QObject () オブジェクトとの間のすべてのシグナルは自動的に切断され、オブジェクトの保留中のポストされたイベントはイベント キューから削除されます。ただし、多くの場合、QObject サブクラスを直接削除するよりも、deleteLater() を使用する方が安全です。

しかし、他のシグナル/スロットプロセスについてはどうですか? つまり、Qt::QueuedConnection または Qt::BlockingQueuedConnection として異なるスレッドに存在するオブジェクトからシグナル/スロットを接続した場合です。それらは処理のためにデキューされていますか?

前もって感謝します。

4

2 に答える 2

2

deleteLaterオブジェクトが属するスレッドからオブジェクトを削除します。Qt::QueuedConnectionQt::BlockingQueuedConnection(またQt::AutoConnection) は、スロットを持つオブジェクトが属するスレッドのイベント ループからスロットが呼び出されるように動作します。
したがって、投稿したこの引用に追加するとQt::*QueuedConnection、オブジェクトが破棄されたときに保留中のものが自動的に破棄されることを意味します。これは、これらの接続と を使用するときに安全であることを意味しますdeleteLater。別のスレッドで使用する場合、または間違ったスレッドからQt::DirectConnectionオブジェクトを直接 ( ) 破棄しようとすると、問題が発生する可能性があります。delete pointer;

于 2013-08-29T08:29:17.847 に答える