Qt QThread 创建多线程程序
参考Qt5.9 C++开发指南,侵删
Qt为多线程操作提供了完整的支持,QThread是线程类,是实现多线程操作的核心类,大多从QThread继承定义自己的线程类。
线程之间的同步是其交互的主要问题,Qt提供了QMutex、QMutexLocker、QReadWriteLock、QwaitCondition和QSemaphore等多种类用于实现线程之间的同步。
一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程所需要完成的任务。
将应用程序的线程称为主线程,额外创建的线程称为工作线程。一般在主线程里创建工作线程,并调用start()开始执行工作线程的任务,start()会在内部调用run()函数,进入工作线程的事件循环,在run()函数里调用exit()或quit()可以结束线程的事件循环,或者在主线程里调用terminate()强制结束线程。
定义一个掷骰子的线程类QDiceTHread,类的声明如下:
#include <QThread>
class QDiceThread : public QThread
{
Q_OBJECT
private:
int m_seq=0;//掷骰子次数序号
int m_diceValue;//骰子点数
bool m_Paused=true; //掷一次骰子
bool m_stop=false; //停止线程
protected:
void run() Q_DECL_OVERRIDE; //重写虚函数run(),在此函数里完成线程的主要任务
public:
QDiceThread();
void diceBegin();//掷一次骰子
void dicePause();//暂停
void stopThread(); //结束线程
signals:
void newValue(int seq,int diceValue); //产生新点数的信号
};
QDiceTHread类的实现代码如下:
#include "qdicethread.h"
#include <QTime>
QDiceThread::QDiceThread()
{
}
void QDiceThread::diceBegin()
{ //开始掷骰子
m_Paused=false;
}
void QDiceThread::dicePause()
{//暂停掷骰子
m_Paused=true;
}
void QDiceThread::stopThread()
{//停止线程
m_stop=true;
}
void QDiceThread::run()
{//线程任务
m_stop=false;//启动线程时令m_stop=false
m_seq=0; //掷骰子次数
qsrand(QTime::currentTime().msec());//随机数初始化,qsrand是线程安全的
//在while循环体内,根据m_Paused判断当前是否需要掷骰子,如果需要掷骰子,用随机函数生成一次骰子的点数,再利用newValue()函数传递信号参数
while(!m_stop)//循环主体
{
if (!m_Paused)
{
m_diceValue=qrand(); //获取随机数
m_diceValue=(m_diceValue % 6)+1;
m_seq++;
emit newValue(m_seq,m_diceValue); //发射信号
}
msleep(500); //线程休眠500ms
}
// 在 m_stop==true时结束线程任务
quit();//相当于 exit(0),退出线程的事件循环
}
使用QDiceTHread类,设计一个掷骰子的应用程序。如下图所示: