Qt线程的一些控制方法

需求

基于上一篇文章的例子,我们来做一些控制的操作,比如暂停,停止,继续这些操作。

五个控制

  • Start 开始线程
  • Stop 结束线程
  • Pause 暂停线程
  • Continue 继续线程
  • Destory 毁灭线程

新增加的三个

上一篇,我们已经有了开始线程跟Destory。现在添加新的三个

  • 结束线程
  • 暂停线程
  • 继续线程

代码

talk is cheap。还是上代码吧,很简单。

void WorkThread::Start()
{
    m_bStop = false;
    emit workStart();
    doWork();
    emit workStop();
}
void WorkThread::doWork()
{
    while(true)
    {
        if (m_bPause)
        {
            emit workPause();
            continue;
        }

        if (m_bStop)
        {
            emit workStop();
            break;
        }

        if (m_bDestory)
        {
            emit workDestory();
            break;
        }

#ifdef Q_OS_WIN
        Sleep(1000);
#else
        sleep(1);
#endif
        qDebug()<<"--"<<m_i<<endl;
        m_i++;
    }
}

void WorkThread::Stop()
{
    m_bStop = true;
}

void WorkThread::Pause()
{
    m_bPause = true;
}

void WorkThread::Continue()
{
    m_bPause = false;
}

void WorkThread::Destory()
{
    m_bDestory = true;
}

上面的代码为控制线程的函数,下面是UI线程通过信号槽来控制代码


    m_workerThread = new QThread();
    m_worker = new WorkThread();
    m_worker->moveToThread(m_workerThread);

    connect(ui->btnPause, &QPushButton::clicked, this, &MainWindow::ThreadPause, Qt::DirectConnection);
    connect(ui->btnContinue, &QPushButton::clicked, this, &MainWindow::ThreadContinue ,Qt::DirectConnection);
    connect(ui->btnStop, &QPushButton::clicked, this, &MainWindow::ThreadStop, Qt::DirectConnection);
    connect(ui->btnDestory, &QPushButton::clicked, this, &MainWindow::ThreadDestory, Qt::DirectConnection);

    //启动线程
    connect(ui->btnStart, &QPushButton::clicked, this, &MainWindow::ThreadStart);
    connect(m_workerThread, &QThread::started, m_worker, &WorkThread::Start);
    //stop之后继续走
    connect(this, &MainWindow::threadStart, m_worker, &WorkThread::Start);

你会发现我的控制全部使用信号槽来进行线程之间的通信。

上面的代码只是一个简单的例子,全部的工程代码都在这里。

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


文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
Qt的线程同步 - QMutex and QMutexLocker Qt的线程同步 - QMutex and QMutexLocker
QMutex锁是多线程同步常用的方法Qt的锁 - QMutex。C++的锁 - std::mutex;QMutex可以手动调用Lock跟UnLock来加锁跟解锁。但是既然我们都写C++的,还是充分利用C++的RAII的来进行资源管理,避免线
下一篇 
QThread线程官方的推荐的写法 QThread线程官方的推荐的写法
序直接重写QThread是没有问题的,但是重写QThread这种方式不太灵活,对于重写的Thread来讲,只有run函数才会在新的线程中。对于重写的QThread是可以带出来对应的数据得,但是自己响应自己的槽函数的话,就不太灵活了,Qt的老
  目录