美文网首页
Qt多线程即写即用QThread实现方法

Qt多线程即写即用QThread实现方法

作者: Qt工坊 | 来源:发表于2018-11-20 16:51 被阅读0次

    本文所介绍的这种Qt的线程用法在Qt的官方文档中有类似介绍,这里给出一个完整的示例共读者参考。本文介绍的这种方法,并不是常见的通过继承QThread,重写run()函数来实现Qt多线程,而是通过moveToThread(QThread * thread)函数将工作类对象移到所创建的QThread对象中去执行。本方法巧妙的利用了Qt信号和槽机制。

    基本思想

    1. 在主线程中,哪里需用多线程,就在哪里创建一个QThread实例;
    2. 把耗时操作封装到一个继承于QObject的子类(这里叫做工作类Worker)槽函数中;
    3. 创建QThread实例和Worker实例,建立他们之间的信号和槽关系;
    4. 调用Worker实例的moveToThread(QThread * thread)函数,将它移动到创建的QThread线程中去;
    5. 最后,执行QThread线程的start()方法。

    工作类

    worker.h

    #ifndef WORKER_H
    #define WORKER_H
    #include <QObject>
    class Worker : public QObject
    {
        Q_OBJECT
    public:
        explicit Worker(QObject *parent = 0);
    signals:
        void complete();
    public slots:
        void doLongTimeWork();//耗时操作
    };
    #endif // WORKER_H
    

    worker.cpp

    #include "worker.h"
    #include <QDebug>
    #include <QThread>
    Worker::Worker(QObject *parent) : QObject(parent)
    {
    
    }
    void Worker::doLongTimeWork()
    {
        qDebug()<<__LINE__<<__FUNCTION__<<" - enter";
        qint64 count = 100;
        while(count--){
            QThread::msleep(10);
            qDebug()<<__LINE__<<__FUNCTION__<<"count = "<<count;
        }
        emit complete();
        qDebug()<<__LINE__<<__FUNCTION__<<" - leave";
    }
    

    使用方法

    void MainWindow::on_pushButtonDoWork_clicked()
    {
        Worker* worker = new Worker();
        QThread* thread = new QThread();
        //当线程启动时,执行Worker类的耗时函数doLongTimeWork()
        connect(thread,SIGNAL(started()),worker,SLOT(doLongTimeWork()));
        //当耗时函数执行完毕,发出complete()信号时,删除worker实例
        connect(worker,SIGNAL(complete()),worker,SLOT(deleteLater()));
        //当worker对象实例销毁时,退出线程
        connect(worker,SIGNAL(destroyed(QObject*)),thread,SLOT(quit()));
        //当线程结束时,销毁线程对象实例
        connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
        //移动worker对象实例到线程中
        worker->moveToThread(thread);
        //启动线程
        thread->start();
    }
    

    运行效果

    运行效果.png

    源代码下载

    百度网盘分享地址:
    链接:https://pan.baidu.com/s/1vKXwHnagnS-RLgafYaec4Q
    提取码:gsii

    相关文章

      网友评论

          本文标题:Qt多线程即写即用QThread实现方法

          本文链接:https://www.haomeiwen.com/subject/jjjxqqtx.html