Qt的QThread多线程使用

QThread简介

最近开发某C++的AI项目,需要用到界面,为了计算过程不阻塞界面,需要使用多线程,在这里学习下Qt自带的多线程操作。

QThread是一个与平台无关的线程类,用于多线程的编程。具体可以在文档中中索引QThread关键字。实际开发中,一般继承这个类,然后运行类的run函数,这也是一个槽,注意接受一个整型数据。耗时的操作放在run函数中运行。

实际应用

下面给出一个多线程的模拟文件传输的例子。定义一个MyThread类,继承自QThread,在run函数中模拟一次传输。主界面显示进度。
运行效果:
初始化:
Qt的QThread多线程使用_第1张图片

传输过程:
Qt的QThread多线程使用_第2张图片
传输完毕:
Qt的QThread多线程使用_第3张图片

该代码没有给出界面设计的,只要自己从中拖拽进去一个QPushButton、QProgressBar和QLabel即可,都是使用的默认名称。

自定义的类头文件

/*
* mythread.h
*/
#ifndef MYTHERAD_H
#define MYTHERAD_H

#include 
#include 

class MyTherad : public QThread
{
    Q_OBJECT
public:
    MyTherad();
    void run() override;
    void startThread();
    unsigned long t;        // 间断时间
signals:
    void resultReady(const QString &s);
    void sendValue(int v);  // 发送数据用的
};

#endif // MYTHERAD_H

实现文件

/*
* mythread.cpp
*/
#include "mytherad.h"

MyTherad::MyTherad()
{
    t=100;  // 默认睡眠1000毫秒
}

void MyTherad::run(){
    QString result=tr("数据传输完毕!");
    for(int i=0;i<=100;++i){
        msleep(t);
        sendValue(i);   // 向外界发送数据
    }
    emit resultReady(result);
}

void MyTherad::startThread(){
    run();
}

Widget窗口的头文件

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 
#include "mytherad.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void setText();

private:
    Ui::Widget *ui;

    MyTherad myThread;
};

#endif // WIDGET_H

Widget窗口的实现文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 重新显示文字,注意槽的连接顺序
    QObject::connect(ui->pushButton,&QPushButton::clicked,this,&Widget::setText);
    // 启动线程
    QObject::connect(ui->pushButton,&QPushButton::clicked,&myThread,&MyTherad::startThread);
    // 显示数据
    QObject::connect(&myThread,&MyTherad::sendValue,ui->progressBar,&QProgressBar::setValue);
    // 追加数据内容
    QObject::connect(&myThread,&MyTherad::resultReady,ui->label,&QLabel::setText);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setText(){
    ui->label->setText("等待数据传输........");
}

你可能感兴趣的:(Qt,Qt,多线程)