跳转至

多线程

Qt 的多线程操作根据其发展历史,有两种使用方式。

  • Qt Version 4.6 以前,通过继承 Thread 类实现。
  • Qt Version 4.6 以后,推荐继承 QObject 类实现。

1. 继承 QObject 使用多线程

首先需要创建子线程类(例:MyThread

该类需要继承 QObject 类。

生成的 MyThread 类代码如下

MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>

class MyThread : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);

    //没有继承 QThread,所以没有run() 函数
    //自定义线程处理函数,自己命名
    //同样的,也是唯一的线程处理函数,其他函数仍运行在主线程
    void myTimeout();

    //设置线程开始与结束的标记位
    void setFlag(bool flag = true);

signals:
    void mySignal();

public slots:

private:
    // 标志位
    bool isStop;
};

#endif // MYTHREAD_H
MyThread.cpp
#include "MyThread.h"
#include <QThread>
#include <QDebug>
#include <QMessageBox>

MyThread::MyThread(QObject *parent) : QObject(parent)
{
    //线程一开始是要执行的,所以设置为 false ,注意逻辑
    isStop = false;
}

void MyThread::myTimeout(){
    while(isStop == false){  //如归线程在运行,才继续执行

        /*
         *  线程中需要执行的代码
        */

        //线程函数内部绝对不允许操作图形界面,会报错
        //QMessageBox::aboutQt(NULL);

        if(true == isStop){ //如果主线程将isstop设置为true,则子线程停止执行,调出while循环
            break;
        }
    }
}

void MyThread::setFlag(bool flag){
    isStop = flag;
}