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 提交一个函子或一个线程安全的方法来在线程池中执行。