Qt中QThread執行緒建立並在執行完成後自動析構的方法
阿新 • • 發佈:2019-02-06
1. QThread執行緒示例
下面是一個基本的執行緒的相關標頭檔案和原始檔。
#ifndef TEST1THREAD_H
#define TEST1THREAD_H
#include <QThread>
class Test1Thread : public QThread
{
public:
Test1Thread();
~Test1Thread();
protected:
void run();
};
#endif // TEST1THREAD_H
#include "Test1Thread.h"
#include <QDebug>
Test1Thread::Test1Thread()
{
qDebug() << "Test1Thread::Test1Thread()";
}
Test1Thread::~Test1Thread()
{
qDebug() << "Test1Thread::~Test1Thread()";
}
void Test1Thread::run()
{
qDebug() << "Test1Thread::run()";
}
上面的三個qDebug內容完全能夠監控執行到哪一步了以及執行的情況。
下面展示兩個錯誤的操作方法。
1.0 基本的需求
需要在觸發一個方法的時候,在這個方法裡面執行相關的執行緒操作。
1.1 直接在執行的方法裡面建立物件
如下的程式碼裡面是對這個執行緒的建立和執行:
void MainWindow::on_pushButton_clicked()
{
Test1Thread t1t;
t1t.start();
}
執行的結果如下:
Test1Thread::Test1Thread()
Test1Thread::~Test1Thread()
Test1Thread::run()
QThread: Destroyed while thread is still running
QMutex: destroying locked mutex
出現這個問題的原因是,這個執行緒物件的宣告週期是觸發按鍵的這個方法裡面,在完成這裡面的程式碼後,會對這裡面的內容進行析構,但是這個時候,執行緒上的內容會被強制清理,然後就出現了下面的錯誤;換一句話說,就是沒有正確釋放執行緒。
1.2 在需要執行的方法裡面new一個物件
程式碼如下:
void MainWindow::on_pushButton_clicked()
{
Test1Thread *t1t = new Test1Thread;
t1t->start();
}
執行的結果如下:
Test1Thread::Test1Thread()
Test1Thread::run()
這樣的話,看似可以正常執行,但是造成了內容的洩露,開闢的新的物件一直在記憶體裡面,不能將其析構。
2 較好的一個解決方案
有一個比較好的方法,如下:
void MainWindow::on_pushButton_clicked()
{
Test1Thread *t1t = new Test1Thread;
connect(t1t,SIGNAL(finished()),t1t,SLOT(deleteLater()));
t1t->start();
}
執行的結果如下:
Test1Thread::Test1Thread()
Test1Thread::run()
Test1Thread::~Test1Thread()
這樣就已經正常執行了結果。
這是由於執行緒run()方法內的內容執行完成之後會觸發finished()方法,根據在觸發這個訊號之後將其在一會兒後刪除。然後就能正常完成這個執行緒的執行和析構。