公众号: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

公众号:Qt那些事儿

公众号

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐