QThread 的基本用法

QThread 是平臺執行緒的控制代碼。它允許你通過監視執行緒的生命週期來管理執行緒,並請求它完成其工作。

在大多數情況下,不建議繼承該類。預設的 run 方法啟動一個事件迴圈,可以將事件分派給生活在類中的物件。通過將 QMetaCallEvent 分派給目標物件來實現跨執行緒訊號槽連線。

QObject 例項可以移動到一個執行緒,在那裡它將處理它的事件,例如定時器事件或槽/方法呼叫。

要線上程上工作,首先要建立自己的工人類,該工作類派生自 QObject。然後將其移動到執行緒。物件可以自動執行自己的程式碼,例如使用 QMetaObject::invokeMethod()

#include <QObject>

class MyWorker : public QObject
{
    Q_OBJECT
public:
    Q_SLOT void doWork() {
        qDebug() << "doWork()" << QThread::currentThread();
        // and do some long operation here
    }
    MyWorker(QObject * parent = nullptr) : QObject{parent} {}
};

class MyController : public QObject
{
    Q_OBJECT
    Worker worker;
    QThread workerThread;
public:
    MyController()  {
        worker.moveToThread(&workerThread);
        // provide meaningful debug output
        workerThread.setObjectName("workerThread");
        workerThread.start();
        // the thread starts the event loop and blocks waiting for events
    }
    ~MyController()  {
        workerThread.quit();
        workerThread.wait();
    }
    void operate() {
        // Qt::QueuedConnection ensures that the slot is invoked in its own thread
        QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);
    }
};

如果你的工作者應該是短暫的並且只在其工作完成時才存在,那麼最好通過 QtConcurrent::run 提交一個函子或一個執行緒安全的方法來線上程池中執行。