連接QThread::finished
和QObject::deleteLater
是錯誤的。如果發出信號QThread::finished
,這意味着線程事件循環將不會再次運行,因此不會調用slot QObject::deleteLater
。所以接受的答案是錯誤的。
這是更好地做這樣的:
myClass* object = new myClass();
QThread* worker = new QThread(parent);
object->moveToThread(worker);
connect(object, &QObject::destroyed, worker, &QThread::quit, Qt::DirectConnection);
connect(someObject, SIGNAL(stoItSignal()), object, &QObject::deleteLater);
worker->start();
在某個時候可能需要等待胎面,(例如,當主窗口被銷燬),收拾東西,所以這個說法可能是有用的(在這種情況下Qt::DirectConnection
在上面的代碼是強制性的):
object->deleteLater();
worker->wait(3000);
你知道[QtConcurrent ::運行(http://qt-project.org/doc/qt-4.8/qtconcurrentrun。 HTML)?它使用一個線程池,並且你只是給它一個函數來執行另一個線程。比使用QThread更容易。 – sashoalm 2015-02-23 10:05:29
@sashoalm我知道我們可以繼承QThread並重寫run函數,它會由start()調用觸發,但不會深入。 – Nyaruko 2015-02-23 10:06:51
我不確定你是否瞭解我告訴你的。 – sashoalm 2015-02-23 10:07:32