Qt1-Qt多线程(多线程步骤讲解+代码+演示)

Qt1-Qt多线程(多线程步骤讲解+代码+演示)

  • 1. 线程简单介绍
  • 2. qt多进程怎么写
    • 2.1. 创建类(继承QObject)
    • 2.2 改为继承自QThread
    • 2.3 重写QThread类中的run函数
    • 2.4 信号与槽方式启动QThread对象的start函数
    • 2.5 关联信号与槽,操作
    • 2.6 线程结束
  • 3. 以例子来说明:
  • 4. 效果演示
  • 5. 代码
    • basicthread.h
    • basicthread.cpp
    • tempThread.h
    • tempthread.cpp
    • mainwindowpower.h
    • mainwindowpower.cpp

说明:Qt系列为本人Qt开发心得,会一直慢慢更新
Qt系列第一篇主要参考: https://blog.csdn.net/qq_48985554/article/details/114990083
该文作者写的非常简练且实用,入门友好,该系列第一篇大部分都是该作者内容。

为何要抄一遍?主要是在后边几篇补充Qt的安装、Qt界面假死处理方法…等内容时需要一个基础代码,
便以此为基础进行增加补充,使其从一个实验走向一个项目。

1. 线程简单介绍

进程 运行中的程序!没运行的不算
main函数开始运行 到 main函数结束
操作系统上资源调度的基本单位!

线程 函数 并发执行
操作系统上程序调度的基本单位!
同一进程内的线程 共享 进程的所有资源

2. qt多进程怎么写

2.1. 创建类(继承QObject)

2.2 改为继承自QThread

2.3 重写QThread类中的run函数

2.4 信号与槽方式启动QThread对象的start函数

2.5 关联信号与槽,操作

2.6 线程结束

3. 以例子来说明:

做两个文本框显示数据,一个按钮控制开始和结束。
其中两文本框分别为基础数据和温度数据,
基础数据简化为显示时间,温度数据显示随机数。

4. 效果演示

Qt1-Qt多线程(多线程步骤讲解+代码+演示)_第1张图片

5. 代码

Qt1-Qt多线程(多线程步骤讲解+代码+演示)_第2张图片

basicthread.h

#ifndef BASICTHREAD_H
#define BASICTHREAD_H

//1. 头文件声明
#include 
#include 

//2. 继承线程类
class basicThread : public QThread
{
    Q_OBJECT

public:
    basicThread();

//3. 自定义信号
signals:
    void basicSignal();

//4. 重写run函数
protected:
    void run();

};

#endif // BASICTHREAD_Hs

basicthread.cpp

#include "basicthread.h"

basicThread::basicThread()
{

}

void basicThread::run()
{
    while(1)
    {
        emit basicSignal();
        QThread::msleep(1000*1);
    }
}

tempThread.h

#ifndef TEMPTHREAD_H
#define TEMPTHREAD_H

//1. 头文件声明
#include 
#include 

//2. 继承线程类
class tempThread : public QThread
{
    Q_OBJECT

public:
    tempThread();

//3. 自定义信号
signals:
    void tempSignal();

//4. 重写run函数
protected:
    void run();

};

#endif // TEMPTHREAD_H

tempthread.cpp

#include "tempthread.h"

tempThread::tempThread()
{

}

void tempThread::run()
{
    while (1)
    {
        emit tempSignal();
        QThread::msleep(1000*1);
    }
}

mainwindowpower.h

#ifndef MAINWINDOWPOWER_H
#define MAINWINDOWPOWER_H

#include 
#include 
#include 
#include 
#include "tempthread.h"
#include "basicthread.h"

namespace Ui
{
class MainWindowPower;
}


class MainWindowPower : public QMainWindow
{
    Q_OBJECT

  public:
    explicit MainWindowPower(QWidget *parent = 0);
    ~MainWindowPower();

    void quitThread();                  //退出线程

  private slots:
    void on_startButton_clicked();      //开始/结束按钮
    void DisplayData_temp();            //槽函数:更新温度数据
    void DisplayData_basic();           //槽函数:更新基本数据

private:
    Ui::MainWindowPower *ui;
    int workStatus = 0;                 //开始工作状态

    //线程
    tempThread *tTempThread;            //温度数据线程
    basicThread *bBasicThread;          //基本数据线程

};

#endif // MAINWINDOWPOWER_H

mainwindowpower.cpp

#include "mainwindowpower.h"
#include "ui_mainwindowpower.h"

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

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

//结束线程
void MainWindowPower::quitThread()
{
    tTempThread->terminate();
    tTempThread->wait();
    delete tTempThread;

    bBasicThread->terminate();
    bBasicThread->wait();
    delete bBasicThread;
}

//开始按钮
void MainWindowPower::on_startButton_clicked()
{
    //按下“开始”
    if (workStatus == 0)
    {
        ui->startButton->setText("结束");
        workStatus = 1;     //标记工作状态

        tTempThread = new tempThread();  //建立线程
        bBasicThread = new basicThread();

        connect(tTempThread, &tempThread::tempSignal, this, &MainWindowPower::DisplayData_temp);      //连接信号和槽
        connect(bBasicThread, &basicThread::basicSignal, this, &MainWindowPower::DisplayData_basic);

        tTempThread->start();   //启动线程
        bBasicThread->start();
    }
    //按下“结束”
    else if (workStatus == 1)
    {
        ui->startButton->setText("开始");
        workStatus = 0;     //标记工作状态

        quitThread();   //结束线程
    }
    else
    {
        qDebug() << "status error!";
    }
}

//更新温度数据
void MainWindowPower::DisplayData_temp()
{
    QString str_rand = QString("%1").arg(qrand()%30);
    ui->lineEditTemp0->setText(str_rand);
}

//更新基础数据
void MainWindowPower::DisplayData_basic()
{
    QDateTime currentTime = QDateTime::currentDateTime();
    QString str_time = currentTime.toString("hh:mm:ss");
    ui->lineEditBasic0->setText(str_time);
}

你可能感兴趣的:(1024程序员节,qt,c++)