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类,设计一个掷骰子的应用程序。如下图所示:

原文地址:https://www.cnblogs.com/wsl540/p/13497088.html