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

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

1【QT】多线程

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>namespace Ui {
class MyWidget;
}class MyWidget : public QWidget
{Q_OBJECTpublic: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_OBJECTpublic: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);
}

相关文章:

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

1【QT】多线程 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>namespace Ui { class MyWidget; }class MyWidget : public QWidget {Q_OBJECTpublic:explicit MyWidget(QWidget *parent 0);~MyWidget();/* 5 自定义信号*/ /*所有的信号函数只声明不定义&…...

vscode go语言开发中在任意包运行和调试代码 Example使用方法

一般情况下我们在进行go语言开发的时候我们都需要创建一个main方法和main包才能运行go代码&#xff0c; 针对这个问题&#xff0c;go语言给我们内置了功能强大的testing测试框架&#xff0c; 其中一个很有意思的Example测试就非常的方便使用。 他不管你在什么包&#xff0c;也…...

数据库查询--条件查询

目录 1.关系运算条件的查询 2.逻辑运算符条件的查询 3.带关键字IN的查询 4.带BETWEEN AND关键字的查询 5.空值查询 6.带LIKE关键字的模糊查询 1.关系运算条件的查询 在SELECT语句中&#xff0c;最常见的是使用WHERE字句指定关系运算条件对数据进行过滤。 语法格式&#x…...

用 Python 和 AkShare 进行个股数据清洗:源码剖析和建议优化

这是《个股清洗源码》一个获取股票买卖盘信息并将其打印到控制台并保存到文件的脚本。 下面我们来对源码进行剖析 先复习一下源码 import os import akshare as ak from akshare import stock_bid_ask_em from datetime import datetime import pandas as pd from io import …...

颍川诞生了两个帝王的仲父

伯、仲、叔、季是古代兄弟的长幼排行顺序&#xff0c;《释名释亲属》载&#xff1a;“父之弟曰仲父……仲父之弟曰叔父”。也就是古代称父亲的兄弟为仲父&#xff0c;多用于帝王对宰相重臣的尊称。 历史上最有名的、有正史记载的帝王“仲父”有两位&#xff0c;而且都出自颍川…...

SpringAMQP发布、订阅——Fanout Exchange交换机代码模拟

发布订阅模型: MQ提供了很多交换机模型 其中常用的有下边三个: Fanout:广播 Direct:路由 Topic:话题 转换器只负责消息路由&#xff0c;不是存储&#xff0c;路由失败则消息丢失 Fanout Exchange:会将接收到的消息路由导每一个跟其绑定的queue. 利用SpringAMQP演示Fanout…...

js原生三种弹框

第一种&#xff1a; alert("提示内容")&#xff1a;提示弹框&#xff1b; alert("提示"); 第二种&#xff1a; prompt("内容","输入框默认值")&#xff1a;输入弹框&#xff0c;第一个值输入框提示内容&#xff0c;第二个值输入框默…...

LWIP+TCP客户端

一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数&#xff0c;如接收回调函数&#xff0c;周期…...

程序人生 | 人生如棋,落子无悔

人生的开始&#xff0c;始于哭声&#xff0c;浮浮沉沉几十年。终了&#xff0c;一声长叹&#xff0c;在一片哭声中撒手离去。 人生的道路虽然漫长&#xff0c;但是关键就是那么几次机会的选择&#xff0c;可以决定此后几十年的光阴。 有个故事讲&#xff1a;古代有个人去砍柴…...

python的deap库使用记录

主要是在遗传符号回归的代码中添加了注释和根据一部分源码做了一点改动 import operator import random import numpy as np import matplotlib.pyplot as plt from deap import algorithms, base, creator, tools, gp from operator import attrgetter##生成数据 def generat…...

一份简历的制作

个人简历是求职者面试前最需要准备的一项工具。一份好的简历可以帮助求职者获得更多的面试机会&#xff0c;并且为面试时的表现奠定基础。以下介绍制作简历的几个注意点&#xff0c;仅供参考。 一、个人信息 姓名*性别联系方式 &#xff08;手机号&#xff09;电子邮箱&#…...

网络匿名--不只是TOR

今天&#xff0c;我们将讨论互联网匿名和隐私&#xff1a; 如何隐藏你的真实身份。 什么是 TOR 。 如何以完全匿名的方式执行黑客任务。 如何使用proxy chain。 如何让我们的匿名性领先一步。 如何使用特定的操作系统保持匿名。 结论&#xff0c;如何实现互联网匿名和隐…...

【论文阅读笔记】Order Matters(AAAI 20)

个人博客地址 注&#xff1a;部分内容参考自GPT生成的内容 论文笔记&#xff1a;Order Matters&#xff08;AAAI 20&#xff09; 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…...

中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域&#xff0c;高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…...

fastText-文本分类

fastText介绍 fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText两个重要的优化:Hierarchical Softmax、N-gr…...

【nodejs 命令行交互神器 - inquirer.js】

需求 大家在开发时&#xff0c;有时需要从命令行读取用户的输入&#xff0c;或者让用户选择。在nodejs中&#xff0c;这个怎么实现? 原生实现 ❌ process.stdin.setEncoding(utf8);process.stdin.on(readable, () > {let chunk;// 使用循环确保我们读取所有的可用输入wh…...

Liunx软件包管理(上)

目录 一.前言 二.rpm RPM 包的结构 安装与升级 卸载 查询 验证 信息输出 三.yum Yum 的特点 安装和卸载 查询和信息 仓库管理 维护和调试 常用选项 四.更换镜像源 常用的镜像源 更换镜像源基础操作 一.前言 Linux 的软件包管理是指在 Linux 操作系统中安…...

华为eNSP中型企业局域网网络规划设计(下)

→b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;上&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…...

C语言(指针)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…...

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

在 csdn.net 下载 strawberry-perl-5.32.1.1-64bit.zip 解压安装在 D:\Strawberry\ 运行 cpan install MIDI::Simple D:\Strawberry\c\bin\gmake.exe test -- OK Running make install for CONKLIN/MIDI-Perl-0.84.tar.gz Installing D:\Strawberry\perl\site\lib\MIDI.pm I…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...