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