【QT多线程】继承于QObject的类转移到QThread

索引

1.继承QObject的多线程实现

继承QObject多线程的方法线程的创建很简单,只要让QThread的start函数运行起来就行,但是需要注意销毁线程的方法
在线程创建之后,这个QObject的销毁不应该在主线程里进行,而是通过deleteLater槽进行安全的销毁,因此,继承QObject多线程的方法在创建时有几个槽函数需要特别关注:

一个是QThread的finished信号对接QObject的deleteLater使得线程结束后,继承QObject的那个多线程类会自己销毁
另一个是QThread的finished信号对接QThread自己的deleteLater,这个不是必须,下面官方例子就没这样做

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;//继承QObject的多线程不能指定父对象
        worker->moveToThread(&workerThread);//在连接信号槽之前调用moveToThread,不需要处理connect的第五个参数,否则就显示声明用Qt::QueuedConnection来连接
        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.https://blog.csdn.net/czyt1988/article/details/71194457

上一篇:五种线程池的分类和作用


下一篇:线程池的核心参数介绍