1. 程式人生 > >Qt執行緒 - 繼承QObject方式

Qt執行緒 - 繼承QObject方式

Qt執行緒 - 繼承QObject方式

Qt使用執行緒有兩種方式,在新版本的Qt中,Qt官方推薦使用繼承QObject的方式,本文件記錄使用此方法執行緒的實驗過程。

本文轉自:http://beself.top/2018/11/09/qt-thread-inherit-qobject/

執行緒實驗總結

在實驗1 至實驗5終於得出結論,使用繼承QObject的方式實現多執行緒的方式,

  1. 使用繼承QObject的方式實現多執行緒的方式經過實驗證明是可以的,具體過程請仔細觀察實驗過程記錄;
  2. 本次實驗中實驗了終止執行緒的一種方式,通過變數來跳出迴圈執行緒;
  3. 在使用變數共享的方式退出執行緒是使用QMutexLocker的方式進行變數保護;

官方示例

class Worker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const QString &parameter) {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }

signals:
    void resultReady(const QString &result);
};

class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    Controller() {
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &Controller::operate, worker, &Worker::doWork);
        connect(worker, &Worker::resultReady, this, &Controller::handleResults);
        workerThread.start();
    }
    ~Controller() {
        workerThread.quit();
        workerThread.wait();
    }
public slots:
    void handleResults(const QString &);
signals:
    void operate(const QString &);
};

從示例中可以看出,總結一下步驟:

  1. 新建一個類並繼承QObject基類;
  2. 在主執行緒中new出這個新建的類,新類不能有父類,再宣告一個QThread類,並將類moveToThread到執行緒中;
  3. 通過start開始執行緒;
  4. 退出執行緒時需要退出執行緒;

更多實驗過程

更多實驗過程請檢視原文:http://beself.top/2018/11/09/qt-thread-inherit-qobject/