1. 程式人生 > >Qt中QThread執行緒建立並在執行完成後自動析構的方法

Qt中QThread執行緒建立並在執行完成後自動析構的方法

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()方法,根據在觸發這個訊號之後將其在一會兒後刪除。然後就能正常完成這個執行緒的執行和析構。