QThread线程官方的推荐的写法

直接重写QThread是没有问题的,但是重写QThread这种方式不太灵活,对于重写的Thread来讲,只有run函数才会在新的线程中。对于重写的QThread是可以带出来对应的数据得,但是自己响应自己的槽函数的话,就不太灵活了,Qt的老版本代码中甚至写了这样的代码。

    WorkerThread(QObject *parent = 0)
        : QThread(parent)
    {
           moveToThread(this);
    }

这种写法是非常不清真的。包括Qt的QThread介绍中,都不推荐这样写了。
今天给大家介绍新的实现方式,这种实现方式相当灵活,可以任意的启动,暂停之类的操作,都是通过Qt的信号槽来实现。我们先继续实现上一个例子。这次使用新的实现方式。

重写QObject,move到新的线程中。

这样是QObject自己的消息循环放到了新的线程中,跨线程之间信号槽就随随便便的使用了。

上代码

class WorkThread : public QObject
{
    Q_OBJECT
public:
    WorkThread(QObject* parent = nullptr);
    ~WorkThread();
public slots:
    void start1();
    void doWork();
signals:
    void workFinished();
    void workStart();
};

//cpp
WorkThread::WorkThread(QObject* parent) : QObject (parent)
{
}
WorkThread::~WorkThread()
{
}
void WorkThread::start1()
{
    emit workStart();
    doWork();
}
void WorkThread::doWork()
{
    for (int i = 0; i < 1000; i++)
    {
        qDebug()<<i<<endl;
    }
    emit workFinished();
}

然后上逻辑代码

    m_workerThread = new QThread();
    WorkThread* worker = new WorkThread();
    worker->moveToThread(m_workerThread);

    //开始线程
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::ThreadStart);
    connect(m_workerThread, &QThread::started, worker, &WorkThread::start1);

    //销毁线程
    //等工作的QObject结束,让线程停止结束
    connect(worker, &WorkThread::workFinished, m_workerThread, [this]()
    {
        m_workerThread->quit();
        m_workerThread->wait();
    });

    //线程停止发给QObject让他自己销毁。
    connect(m_workerThread, &QThread::finished, worker, &WorkThread::deleteLater);

    // QObject销毁之后,让线程自己销毁。
    connect(worker, &WorkThread::destroyed, m_workerThread, &QThread::deleteLater);

直接看connect,一个个解释

  1. connect绑定按钮,点击线程启动
  2. 线程启动,Object中的work函数开始工作,输出1-1000
  3. Object输出结束,线程停止
  4. 线程停止,QObject自己销毁自己
  5. QObject销毁之后,通知Thread销毁自己

完美释放了QThread的资源。

当然有人问你这样的操作太复杂了,没必要。其实对于简单的逻辑来讲,这样确实没必要。但是对于颗粒度控制来讲,这种更有优势,下一篇。我会针对这个代码通过信号槽做一些控制的操作。

附上工程代码

https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2


文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
Qt线程的一些控制方法 Qt线程的一些控制方法
需求基于上一篇文章的例子,我们来做一些控制的操作,比如暂停,停止,继续这些操作。 五个控制 Start 开始线程 Stop 结束线程 Pause 暂停线程 Continue 继续线程 Destory 毁灭线程 新增加的三个上一篇,我们已经
下一篇 
Qt来实现MFC的OnIdle效果 Qt来实现MFC的OnIdle效果
序很久很久以前,四年以前,我还是win上的开发,前东家自己实现了一套界面库,使用了MFC + Win32API 来实现的。 那时候还没有接触过Qt,就只能自己维护了,当时是看到了MFC的OnIdle函数。这个函数是利用cpu的空余时间来做一
2020-06-30
  目录