0

私のコードでは、ワーカー スレッドがオブジェクト A を作成し、メイン スレッド クラス B のデストラクタがワーカー スレッドのデストラクタを呼び出し、オブジェクト A がワーカー スレッドのデストラクタで削除されます。コードは次のようになります。

WorkerThread::foo() {
Object *p = new Object;
}

WorkerThread::~WorkerThread {
delete p;
wait();
}

B::~B() {
emit signal(); 
//this signal is to ask worker thread to quit, 
//the signal/slot connection is connect(this, SIGNAL), mWorkerThread, SLOT));
delete mWorkerThread;
}

ここでの問題は、ワーカー スレッドの他の関数がまだ *p (オブジェクト A) を使用している可能性があることです。WorkerThread デストラクタにミューテックスを追加できることはわかっています。しかし、オブジェクト A を作成していないスレッドでオブジェクト A を削除してはならないというエラー メッセージが表示されることがあります。これは、ワーカー スレッドで *p を削除する必要があるということですか? どうすれば機能しますか?別の信号とスロットを使用しますか?

ありがとう、

4

1 に答える 1

0

可能であればrun()、スレッドの関数内でオブジェクトを作成および破棄します。

オブジェクトが呼び出し元のスレッドに存在する必要がある場合 (たとえば、Qt はウィジェットがメイン スレッドに存在するのが好きです)、スレッド オブジェクトのコンストラクターで作成 (または渡します) し、現在のようにデストラクタで削除します (これはスレッドを想定しています)。完了後に呼び出し元スレッドによって破棄されます)。

また、kill シグナルを発行した後join()、スレッドを削除する前に、クリーンに終了したことを確認します。

于 2013-01-16T00:39:10.080 に答える