当前位置: 首页 > article >正文

Qt 学习第 天:线程与多线程

1024程序员快乐,如果这博客让你学习到了知识,请给我一个免费的赞❤️

一、创建界面文件

LCDnumber

二、创建mythread类,继承QObject

三、在MyThread.h文件做修改,并且加上函数声明

引入头文件,改变继承

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

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

protected:
    void run(); // 入口函数 -- 需要start()启动

signals:
    void sigDone();

public slots:
};

#endif // MYTHREAD_H

四、实现run方法

#include "mythread.h"

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

}

void MyThread::run()
{
    // 模拟复杂的操作
    sleep(5); //休眠5s
    emit sigDone();
}

五、使用计时器来控制LCDnumber

//计时器
    mytimer = new QTimer(this);
    myt = new MyThread(this);

    connect(mytimer, &QTimer::timeout, this, [=](){
        static int num = 0;
        ui->lcdNumber->display(num++);
    });

六、实现按钮的槽函数

void MyWidget::on_begin_clicked()
{
    //如果计时器开着
    if(mytimer->isActive() == true)
    {
        return;
    }
    // 启动定时器
    mytimer->start(1000); // ms

    // 启动子线程
    myt->start();
}

子线程运行结束后,停止计数器

// 子线程信号,子线程运行结束停止计数器
    connect(myt, &MyThread::finished, mytimer, &QTimer::stop); 

完整代码

mythread.cpp

#include "mythread.h"

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

}

void MyThread::run()
{
    // 模拟复杂的操作
    sleep(5); //休眠5s
    emit sigDone();
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

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

protected:
    void run(); // 入口函数 -- 需要start()启动

signals:
    void sigDone();

public slots:
};

#endif // MYTHREAD_H

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QThread>
#include <QDebug>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    //计时器
    mytimer = new QTimer(this);
    myt = new MyThread(this);

    connect(mytimer, &QTimer::timeout, this, [=](){
        static int num = 0;
        ui->lcdNumber->display(num++);
    });

    // 子线程信号,子线程运行结束停止计数器
    connect(myt, &MyThread::finished, mytimer, &QTimer::stop);

}

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

void MyWidget::on_begin_clicked()
{
    //如果计时器开着
    if(mytimer->isActive() == true)
    {
        return;
    }
    // 启动定时器
    mytimer->start(1000); // ms

    // 启动子线程
    myt->start();
}

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QTimer>
#include "mythread.h"

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_begin_clicked();

private:
    Ui::MyWidget *ui;

    QTimer* mytimer;
    MyThread *myt;
};

#endif // MYWIDGET_H

 


http://www.kler.cn/news/364406.html

相关文章:

  • nginx 日志配置笔记
  • 戴维南,叠加,稳态笔记
  • 程序员的最终出路在哪
  • 进程间通信(二)消息队列、共享内存、信号量
  • 取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题
  • CSS 网格布局
  • 4个在线抠图网站,AI一键智能抠图,3秒抠出!
  • 自学C语言——函数(全)
  • 基于单片机的短信火灾报警系统
  • 错误:无法推送一些引用到 ‘https://gitee.com/chek_kk/python-electron-app.git‘
  • RHCSA笔记一
  • 反悔贪心学习笔记[浅谈]
  • 【Axure高保真原型】分级树筛选中继器表格
  • 基于 Python 的机器学习模型部署到 Flask Web 应用:从训练到部署的完整指南
  • 深入计算机语言之C++:类与对象(中)
  • Redis批量获取缓存的方法
  • 【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本
  • js基础入门篇
  • 【计算机网络 - 基础问题】每日 3 题(五十六)
  • 双十一母婴用品排行榜推荐出炉!建议收藏!看宝妈要买哪些东西
  • NewStarCTF 2023 公开赛道 Web week1-week2
  • 安全见闻(3)
  • 51单片机快速入门之 IIC I2C通信
  • 昇思MindSpore进阶教程--安装常见问题(中)
  • Modbus转IEC61850网关iGate-850实现电力系统采集电力仪表
  • Facebook区块链生态系统:去中心化社交平台的未来