当前位置: 首页 > 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…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...