zoukankan      html  css  js  c++  java
  • 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类,设计一个掷骰子的应用程序。如下图所示:

  • 相关阅读:
    用户登录
    open >>>文件操作
    随机数
    内置函数
    函数练习
    函数的动态参数
    函数的指定参数
    函数的普通参数
    函数的初步认识
    copy
  • 原文地址:https://www.cnblogs.com/wsl540/p/13497088.html
Copyright © 2011-2022 走看看