目录
  • 一、线程基础
    • 1、GUI线程与工作线程
    • 2、数据的同步访问
  • 二、QT多线程简介
    • 三、QThread线程
      • 四、简单实例

        一、线程基础

        1、GUI线程与工作线程

        每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

        2、数据的同步访问

        每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

        二、QT多线程简介

            Qt通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。

            Qt中线程类包含如下:

        • QThread 提供了跨平台的多线程解决方案
        • QThreadStorage 提供逐线程数据存储
        • QMutex 提供相互排斥的锁,或互斥量
        • QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁
        • QReadWriterLock 提供了一个可以同时读操作的锁
        • QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁
        • QSemaphore 提供了一个整型信号量,是互斥量的泛化
        • QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

        三、QThread线程

        1、QThread线程基础

            QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。

            void run()函数是线程体函数,用于定义线程的功能。

            void start()函数是启动函数,用于将线程入口地址设置为run函数。

            void terminate()函数用于强制结束线程,不保证数据完整性和资源释放。

            QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也称为GUI线程,是唯一允许执行GUI相关操作的线程。另外,必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。

            当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。

            从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。 
            使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。

            静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回线程的ID,后者返回一个线程指针。

        要设置线程的名称,可以在启动线程之前调用setObjectName()。如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名)。

        四、简单实例

        1、建立工程

        Qt5多线程编程的实现

        2、设计ui及控件、控件属性

        Qt5多线程编程的实现

        3、添加工作线程

        建立头文件workthread.h

        Qt5多线程编程的实现

        Qt5多线程编程的实现

        在右侧添加如下代码

        Qt5多线程编程的实现

        #include <QThread>
         
        class WorkThread : public QThread
        {
            Q_OBJECT
         
        public:
            WorkThread();
         
        protected:
            void run();
        };

        4、添加workthread.cpp文件

        Qt5多线程编程的实现

        在右侧添加如下代码:

        Qt5多线程编程的实现

        重写run()函数

        Qt5多线程编程的实现

        重写run()函数

        Qt5多线程编程的实现

        #include "workthread.h"
        #include <QtDebug>
         
        WorkThread::WorkThread()
        {
         
        }
         
        void WorkThread::run()
        {
            while (true)
            {
                for ( int n = 0; n < 10; n++ )
                {
                    qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
                }
            }
        }

        5、在threaddlg.h中添加如下内容:

        Qt5多线程编程的实现

        #include "workthread.h"
        #define MAXSIZE 1
         
         
         
        public slots:
            void slotStart();
            void slotStop();
            void slotExit();
         
        private:
         
            WorkThread *workThread[MAXSIZE];

         6、在threaddlg.cpp中完成槽函数功能

            connect(ui->startBtn,   SIGNAL(clicked(bool)),this, SLOT(slotStart()));
            connect(ui->stopBtn,    SIGNAL(clicked(bool)),this, SLOT(slotStop()));
            connect(ui->exitBtn,    SIGNAL(clicked(bool)),this, SLOT(slotExit()));
         
        void threadDlg::slotStart()
        {
            for ( int i = 0; i < MAXSIZE; i++ )
            {
                workThread[i] = new WorkThread();
            }
         
            for ( int i = 0; i < MAXSIZE; i++ )
            {
                workThread[i]->start();
            }
         
            ui->startBtn->setEnabled(false);
            ui->stopBtn->setEnabled(true);
        }
        void threadDlg::slotStop()
        {
            for ( int i = 0; i < MAXSIZE; i++ )
            {
                workThread[i]->terminate();
                workThread[i]->wait();
            }
         
            ui->startBtn->setEnabled(true);
            ui->stopBtn->setEnabled(false);
        }
        void threadDlg::slotExit()
        {
            this->close();
        }

        运行效果

        Qt5多线程编程的实现

        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。