1.线程简单介绍

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

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

2.qt多进程怎么写

2.1. 创建类(继承QObject)

2.2 改为继承自QThread

2.3 重写QThread类中的run函数

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

2.5 关联信号与槽,操作

2.6 线程结束

注意点:

  1. 线程结束 先 quit 再wait
  2. 也可以使用terminate()来结束
    上面这两个存在一定的区别,可以看看文档,这里随机数开始,暂停我直接用的第二种,第一种先quit(),再wait()不行

3.以例子来说明:

做两个行文本,一个行文本实时显示当前系统时间
另外一个行文本显示随机数
做两个按钮 (开始 暂停)
点击暂停,随机数停止滚动
点击开始,随机数又开始滚动

4.效果演示

在这里插入图片描述

5.代码

在这里插入图片描述

randThread.h

#ifndef RANDTHREAD_H
#define RANDTHREAD_H

//1.继承QOject
#include <QObject>
#include<QThread>

//2.改为public QThread
class randThread : public QThread
{
    Q_OBJECT
public:
    explicit randThread(QObject *parent = nullptr);

signals:
    //自定义信号
    void  randSignal();
//3.重写run函数
protected:
    void run();//线程入口函数

};

#endif // RANDTHREAD_H

randThread.cpp

#include "randThread.h"

randThread::randThread(QObject *parent) : QThread(parent)
{

}

void randThread::run()
{
    while(1)
    {
        emit randSignal();
        QThread::usleep(1000);
    }

}

timeThrea.h:

#ifndef TIMETHREAD_H
#define TIMETHREAD_H

#include <QObject>
#include<QThread>

class timeThread : public QThread
{
    Q_OBJECT
public:
    explicit timeThread(QObject *parent = nullptr);

signals:
    void timeSignal();//自定义信号
protected:
    void run() ; //线程入口函数

};

#endif // TIMETHREAD_H

timeThread.cpp

#include "timeThread.h"

timeThread::timeThread(QObject *parent) : QThread(parent)
{

}

void timeThread::run()
{
    while(1)
    {
        emit timeSignal();
        QThread::sleep(1);
    }
}

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QTime>
#include<QDateTime>
#include"randThread.h"
#include"timeThread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
public slots:
    void timeSlot();
    void randSlot();
    //线程结束函数
    void quitThreadSlot();
private slots:
    void on_pushButton_open_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::MyWidget *ui;
    //...线程对象....
    randThread*pRandThread;
    timeThread*pTimeThread;


};
#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidgett.h"
#include "ui_MyWidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    setWindowTitle("qt的多线程");
    //....创建线程对象.......
    pRandThread=new randThread(this);
    pTimeThread=new timeThread(this);
    //...调用run函数...每隔1s发送一个信号...
    pRandThread->start();
    pTimeThread->start();

    ui->pushButton_open->setEnabled(false);


    connect(pTimeThread,SIGNAL(timeSignal()),this,SLOT(timeSlot()));
     connect(pRandThread,SIGNAL(randSignal()),this,SLOT(randSlot()));
    //关闭窗口的时候结束线程
    connect(this,SIGNAL(destroyed()),this,SLOT(quitThreadSlot()));

}

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

void MyWidget::timeSlot()
{
    //.1.获取当前的时间
    QDateTime currentTime=QDateTime::currentDateTime();
    QString str_time=currentTime.toString("yyyy.MM.dd ddd hh:mm:ss");
    ui->lineEdit_time->setText(str_time);

}

void MyWidget::randSlot()
{
    // 1.获取一个随机数
    QString str_rand=QString("%1").arg(qrand()%30);
    // 2.显示到文本
    ui->lineEdit_rand->setText(str_rand);
}

void MyWidget::quitThreadSlot()
{
    pTimeThread->quit();
    pTimeThread->wait();

    pRandThread->quit();
    pRandThread->wait();
}
//...开始.....
void MyWidget::on_pushButton_open_clicked()
{
    ui->pushButton_open->setEnabled(false);
    ui->pushButton_close->setEnabled(true);
    pRandThread->start();


}
//...暂停随机数......
void MyWidget::on_pushButton_close_clicked()
{
    ui->pushButton_close->setEnabled(false);
    ui->pushButton_open->setEnabled(true);
    pRandThread->terminate();

}


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐