【C++】-QT多线程-006

1【QT】多线程

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

/* 5 自定义信号*/
/*所有的信号函数只声明不定义!*/
signals:
    void notify();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MyWidget *ui;

    QThread *pThread;//添加线程成员-
};

#endif // MYWIDGET_H



#ifndef WORKER_H
#define WORKER_H

#include <QObject>

/* 2 创建派生类-这里创建一个子线程类*/
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:


public slots:
    /* 7 写子线程类的槽函数*/
    void onNotify();

private:
    /*2.1添加新成员-*/
    void doSomeThing();
};

#endif // WORKER_H





#include "MyWidget.h"
#include <QApplication>

/* 1 添加组件*/

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}




#include "MyWidget.h"
#include "ui_MyWidget.h"

#include <QThread>
#include "Worker.h"


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

/* 3 在主线程中添加子线程*/
    /* 3.1 创建子线程空间*/
//    QThread *pThread=new QThread(this);
    pThread=new QThread(this);//优化
    /* 3.2 创建子线程类*/
    Worker *p=new Worker;
    /* 3.3 将子线程类移动到子线程空间*/
    p->moveToThread(pThread);

    /* 9 子线程优化-子线程结束之前销毁子线程空间中的成员*/
    /*子线程-子线程结束-子线程空间中的成员(这里是1个类)-销毁成员*/
    connect(pThread,&QThread::finished,p,&Worker::deleteLater);

    /*建立主线程中的信号与子线程中槽的连接*/
    connect(this,&MyWidget::notify,p,&Worker::onNotify);

/* 4 启动子线程*/
    pThread->start();
}

MyWidget::~MyWidget()
{
    /* 10 主动结束子线程-在主线程结束之前,先等待子线程执行结束*/
    pThread->quit();//退出线程
    pThread->wait();//等待线程结束

    delete ui;
}

/* 6 写按钮的槽函数*/
void MyWidget::on_pushButton_clicked()
{
    /* 7.1 向子线程中的槽发送信号*/
    emit notify();
}




#include "Worker.h"
#include <QThread>
#include <QDebug>
/*包含头文件->调用类*/



Worker::Worker(QObject *parent) : QObject(parent)
{

}

/* 7 写子线程槽函数*/
/*子线程中的槽-需要与主线程中的信号建立连接/通信-
 * 主线程中的按钮按下,向子线程中的槽发送信号*/
void Worker::onNotify()
{
    /*调用任务函数-流程梳理: 主线程中的信号【notify】->发送信号(主线程的某个成员对象向子线程中的槽)
->接收信号-槽(子线程中的成员对象接收来自主线程成员对象的信号)->执行线程任务(在子线程槽函数中调用任务处理函数)*/
    doSomeThing();/* 7.2 子线程中的槽执行任务*/
}


/* 7.3 写任务函数*/
void Worker::doSomeThing()
{
    for(int i=0;i<10;++i)
    {
        QThread::sleep(1);

        /* 8 添加调试方法-可以观察到子线程任务是否执行*/
        qDebug()<<i;
    }
}

这里特别需要注意一种【ui】调试方法:【qdebug】调试

2【QT】进度条

用于描述程序执行状态

2.1利用行编辑器显示子线程执行状态

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

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

/* 5 自定义信号*/
/*所有的信号函数只声明不定义!*/
signals:
    void notify();

private slots:
    void on_pushButton_clicked();

    /* 11.3 定义进度条槽函数*/
    void onFn(int n);

private:
    Ui::MyWidget *ui;

    QThread *pThread;//添加线程成员-
};

#endif // MYWIDGET_H





#ifndef WORKER_H
#define WORKER_H

#include <QObject>

/* 2 创建派生类-这里创建一个子线程类*/
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    /* 11.1 自定义进度条信号*/
    void fn(int n);

public slots:
    /* 7 写子线程类的槽函数*/
    void onNotify();

private:
    /*2.1添加新成员-*/
    void doSomeThing();
};

#endif // WORKER_H




#include "MyWidget.h"
#include <QApplication>

/* 1 添加组件*/

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}





#include "MyWidget.h"
#include "ui_MyWidget.h"

#include <QThread>
#include "Worker.h"


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

/* 3 在主线程中添加子线程*/
    /* 3.1 创建子线程空间*/
//    QThread *pThread=new QThread(this);
    pThread=new QThread(this);//优化
    /* 3.2 创建子线程类*/
    Worker *p=new Worker;
    /* 3.3 将子线程类移动到子线程空间*/
    p->moveToThread(pThread);

    /* 9 子线程优化-子线程结束之前销毁子线程空间中的成员*/
    /*子线程-子线程结束-子线程空间中的成员(这里是1个类)-销毁成员*/
    connect(pThread,&QThread::finished,p,&Worker::deleteLater);

    /*建立主线程中的信号与子线程中槽的连接*/
    connect(this,&MyWidget::notify,p,&Worker::onNotify);

    /* 11.4 建立进度条的信号与槽的连接*/
    connect(p,&Worker::fn,this,&MyWidget::onFn);

    /* 4 启动子线程*/
    pThread->start();
}

MyWidget::~MyWidget()
{
    /* 10 主动结束子线程-在主线程结束之前,先等待子线程执行结束*/
    pThread->quit();//退出线程
    pThread->wait();//等待线程结束

    delete ui;
}

/* 6 写按钮的槽函数*/
void MyWidget::on_pushButton_clicked()
{
    /* 7.1 向子线程中的槽发送信号*/
    emit notify();
}

/*进度条槽函数*/
void MyWidget::onFn(int n)
{
    /*将进度条接收到的信号信息显示在行编辑器中(界面)*/
    ui->lineEdit->setText(QString::asprintf("%d",n));
}




#include "Worker.h"
#include <QThread>
#include <QDebug>
/*包含头文件->调用类*/



Worker::Worker(QObject *parent) : QObject(parent)
{

}

/* 7 写子线程槽函数*/
/*子线程中的槽-需要与主线程中的信号建立连接/通信-
 * 主线程中的按钮按下,向子线程中的槽发送信号*/
void Worker::onNotify()
{
    /*调用任务函数-流程梳理: 主线程中的信号【notify】->发送信号(主线程的某个成员对象向子线程中的槽)
->接收信号-槽(子线程中的成员对象接收来自主线程成员对象的信号)->执行线程任务(在子线程槽函数中调用任务处理函数)*/
    doSomeThing();/* 7.2 子线程中的槽执行任务*/
}


/* 7.3 写任务函数*/
void Worker::doSomeThing()
{
    for(int i=0;i<10;++i)
    {
        QThread::sleep(1);
#if 0
        /* 8 添加调试方法-可以观察到子线程任务是否执行*/
        qDebug()<<i;
#endif

#if 1
        /* 11.2 发送进度条信号*/
        emit fn(i);
#endif
    }
}

2.2利用进度条显示子线程执行状态

实现方法:在进度条槽函数中添加set方法,使得进度条当前值与槽函数接收到的信号值同步,就实现了进度条动态增长。
/*进度条槽函数*/
void MyWidget::onFn(int n)
{
    /*将进度条接收到的信号信息显示在行编辑器中(界面)*/
    ui->lineEdit->setText(QString::asprintf("%d",n));

    /*同时将信号传给槽的信号信息n,用于设置进度条的当前值*/
    ui->progressBar->setValue(n);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统本地部署Net2FTP文件管理网站并实现远程连接上传下载

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Vue入门到关门之Vue高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性&#xff0c;我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。 放在普通标签上&#xff0c;通过 th…

CRE-LLM:告别复杂特征工程,直接关系抽取

CRE-LLM&#xff1a;告别复杂特征工程&#xff0c;直接关系抽取 提出背景CRE-LLM 宏观分析CRE-LLM 微观分析1. 构建指令集&#xff08;Instruction Design&#xff09;2. 高效微调大型语言模型&#xff08;Efficient Fine-Tuning on LLMs&#xff09;3. 方法讨论&#xff08;Di…

数据结构——链表专题2

文章目录 一、返回倒数第k 个节点二、链表的回文结构三、相交链表 一、返回倒数第k 个节点 原题链接&#xff1a;返回倒数第k 个节点 利用快慢指针的方法&#xff1a;先让fast走k步&#xff0c;然后fast和slow一起走&#xff0c;直到fast为空&#xff0c;最后slow指向的结点就…

智慧工地)智慧工地标准化方案(107页)

2.2 设计思路 对于某某智慧工地管理系统的建设&#xff0c;绝不是对各个子系统进行简单堆砌&#xff0c;而是在满足各子系统功能的基础上&#xff0c;寻求内部各子系统之间、与外部其它智能化系统之间的完美结合。系统主要依托于智慧工地管理平台&#xff0c;来实现对众多子系统…

动态规划算法:路径问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「路径类」的问题&#xff0c;我们的状态表⽰⼀般有两种形式&#xff1a; i. 从 [i, j] 位置出发&#xff0c;巴拉巴拉&#xff1b; ii. 从起始位置出…

《自动机理论、语言和计算导论》阅读笔记:p428-p525

《自动机理论、语言和计算导论》学习第 14 天&#xff0c;p428-p525总结&#xff0c;总计 98 页。 一、技术总结 1.Kruskal’s algorithm(克鲁斯克尔算法) 2.NP-Complete Problems p434, We say L is NP-complete if the following statements are true about L: (1)L is …

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营&#xff0c;但原有技术公司不想再合作或者不想再维持整个技术团队等原因&#xff0c;就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目&#xff0c;这究竟是什么原因呢&#xff…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

暂不要创业,谁创业谁死

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 卢松松视频号会员专区有个会员提问&#xff0c;我感觉挺有代表性的&#xff0c;写成公众号文章&#xff0c;分享给大家&#xff1a; 松哥&#xff0c;我花了太多时间在思考上&#xff0c;而一直没有行动&#xff…

ESG视角下的多期DID构建(2009-2022年)4.5万+数据

随着ESG信息越来越受到重视&#xff0c;一些第三方评级机构开始推出ESG评级产品&#xff0c;目前在第三方数据库能够查到华证、富时罗素、商道融绿、社会价值投资联盟以及Wind自有的ESG评级数据等。其中&#xff0c;商道融绿是中国最早发布ESG评级数据的机构&#xff0c;也是国…

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期&#xff08;Vue2&#xff09; 目录 一文读懂Vue生命周期&#xff08;Vue2&#xff09;1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

VS Code 远程连接 SSH 服务器

文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新&#xff0c;在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器&#xff08;我曾经也是个 …

VueComponent构造函数

//创建school组件——注册给谁 在谁的结构上写const school Vue.extend({name: school,//开发者工具的显示template: <div><h2>学校名称&#xff1a;{{schoolName}}</h2><h2>学校地址&#xff1a;{{adress}}</h2> </div>,//结构data() {…

好用的win10电脑桌面便利贴,桌面便签小工具

在日常办公中&#xff0c;我们经常需要记录重要事项、提醒任务或者临时想法。这时&#xff0c;一款好用的电脑桌面便签或便利贴小工具就显得尤为重要。它们能够帮助我们高效地管理信息&#xff0c;提升工作效率。 那么好用的win10电脑桌面便利贴是哪个呢&#xff1f;电脑桌面便…

算法学习:二分查找

&#x1f525; 引言 在现代计算机科学与软件工程的实践中&#xff0c;高效数据检索是众多应用程序的核心需求之一。二分查找算法&#xff0c;作为解决有序序列查询问题的高效策略&#xff0c;凭借其对数时间复杂度的优越性能&#xff0c;占据着算法领域里举足轻重的地位。本篇内…

It‘s possible that the file was already in use (by a text editor or antivirus)

方法一 删除用户下的.npmrc文件&#xff0c;即不改变全局安装的路径&#xff08;不够好&#xff0c;本质问题仍没有解决&#xff0c;全局还是会安装在C盘&#xff09; 每次都用管理员身份运行命令行&#xff08;不够方便&#xff0c;vscode 下的命令行默认也不是管理员身份运行…

linux通过使用bash脚本同时运行多个命令

1、使用&&或||或;&#xff08;根据需要选择连接符号&#xff09;等来连接多条命令 && -> "与"&#xff0c;一条命令执行出错&#xff0c;则后面命令不执行 || -> "或"&#xff0c;一条命令执行成功&#x…
最新文章