1

だから私はいくつかのサンプルコードを以下に持っています。

workerThread = new QThread();
m_worker->moveToThread( workerThread );
connect( workerThread , SIGNAL( started() ), m_worker, SLOT( createObject() ) );
connect( m_worker, SIGNAL( created() ), this, SLOT( objectReceived() ) );
workerThread->start();

現在、QThread を new で初期化して使用しています。これが使用される唯一のコンテキストである場合、「QThread workerThread」を使用し、そのアドレスを参照して接続するだけで済みませんか? これにより、プログラムがスレッドをヒープに配置する必要がなくなります。new を使用せず、リストした方法を使用すると、「QThread: Destroyed while thread is still running」というエラーが表示されることに気付きました。私がリストした変更を除いて、コードに変更はありません。new を使用すると、このエラーは発生しません。大きな違いはありますか?

4

2 に答える 2

1

http://qt-project.org/doc/qt-4.8/objecttrees.html

物事がヒープに置かれている場合、Qt はより適切にクリーンアップし、より適切に子育てを行います。

QObject がヒープ上に作成される (つまり、new で作成される) と、それらから任意の順序でツリーを構築でき、その後、ツリー内のオブジェクトを任意の順序で破棄できます。ツリー内の QObject が削除されると、オブジェクトに親がある場合、デストラクタはそのオブジェクトを親から自動的に削除します。オブジェクトに子がある場合、デストラクタは各子を自動的に削除します。破棄の順序に関係なく、QObject が 2 回削除されることはありません。

ドキュメントは、スタックにのみ配置された場合に失敗する可能性があることを示しています。

それが役立つことを願っています。

于 2013-04-15T01:26:21.653 に答える