【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代码, 针对这个问题,go语言给我们内置了功能强大的testing测试框架, 其中一个很有意思的Example测试就非常的方便使用。 他不管你在什么包,也…...
数据库查询--条件查询
目录 1.关系运算条件的查询 2.逻辑运算符条件的查询 3.带关键字IN的查询 4.带BETWEEN AND关键字的查询 5.空值查询 6.带LIKE关键字的模糊查询 1.关系运算条件的查询 在SELECT语句中,最常见的是使用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 …...
颍川诞生了两个帝王的仲父
伯、仲、叔、季是古代兄弟的长幼排行顺序,《释名释亲属》载:“父之弟曰仲父……仲父之弟曰叔父”。也就是古代称父亲的兄弟为仲父,多用于帝王对宰相重臣的尊称。 历史上最有名的、有正史记载的帝王“仲父”有两位,而且都出自颍川…...
SpringAMQP发布、订阅——Fanout Exchange交换机代码模拟
发布订阅模型: MQ提供了很多交换机模型 其中常用的有下边三个: Fanout:广播 Direct:路由 Topic:话题 转换器只负责消息路由,不是存储,路由失败则消息丢失 Fanout Exchange:会将接收到的消息路由导每一个跟其绑定的queue. 利用SpringAMQP演示Fanout…...
js原生三种弹框
第一种: alert("提示内容"):提示弹框; alert("提示"); 第二种: prompt("内容","输入框默认值"):输入弹框,第一个值输入框提示内容,第二个值输入框默…...
LWIP+TCP客户端
一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数,如接收回调函数,周期…...
程序人生 | 人生如棋,落子无悔
人生的开始,始于哭声,浮浮沉沉几十年。终了,一声长叹,在一片哭声中撒手离去。 人生的道路虽然漫长,但是关键就是那么几次机会的选择,可以决定此后几十年的光阴。 有个故事讲:古代有个人去砍柴…...
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…...
一份简历的制作
个人简历是求职者面试前最需要准备的一项工具。一份好的简历可以帮助求职者获得更多的面试机会,并且为面试时的表现奠定基础。以下介绍制作简历的几个注意点,仅供参考。 一、个人信息 姓名*性别联系方式 (手机号)电子邮箱&#…...
网络匿名--不只是TOR
今天,我们将讨论互联网匿名和隐私: 如何隐藏你的真实身份。 什么是 TOR 。 如何以完全匿名的方式执行黑客任务。 如何使用proxy chain。 如何让我们的匿名性领先一步。 如何使用特定的操作系统保持匿名。 结论,如何实现互联网匿名和隐…...
【论文阅读笔记】Order Matters(AAAI 20)
个人博客地址 注:部分内容参考自GPT生成的内容 论文笔记:Order Matters(AAAI 20) 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…...
中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!
DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言:探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域,高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…...
fastText-文本分类
fastText介绍 fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点: 1、fastText在保持高精度的情况下加快了训练速度和测试速度 2、fastText不需要预训练好的词向量,fastText会自己训练词向量 3、fastText两个重要的优化:Hierarchical Softmax、N-gr…...
【nodejs 命令行交互神器 - inquirer.js】
需求 大家在开发时,有时需要从命令行读取用户的输入,或者让用户选择。在nodejs中,这个怎么实现? 原生实现 ❌ process.stdin.setEncoding(utf8);process.stdin.on(readable, () > {let chunk;// 使用循环确保我们读取所有的可用输入wh…...
Liunx软件包管理(上)
目录 一.前言 二.rpm RPM 包的结构 安装与升级 卸载 查询 验证 信息输出 三.yum Yum 的特点 安装和卸载 查询和信息 仓库管理 维护和调试 常用选项 四.更换镜像源 常用的镜像源 更换镜像源基础操作 一.前言 Linux 的软件包管理是指在 Linux 操作系统中安…...
华为eNSP中型企业局域网网络规划设计(下)
→b站传送门,感谢大佬← →华为eNSP中型企业局域网网络规划设计(上)← →拓扑图传送门,可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…...
C语言(指针)1
Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏: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…...
如何快速为OpenWrt路由器安装Turbo ACC网络加速:终极性能优化指南
如何快速为OpenWrt路由器安装Turbo ACC网络加速:终极性能优化指南 【免费下载链接】turboacc 一个适用于官方openwrt(22.03/23.05/24.10) firewall4的turboacc 项目地址: https://gitcode.com/gh_mirrors/tu/turboacc 还在为路由器卡顿、网络延迟而烦恼吗&am…...
5分钟掌握AMD Ryzen终极调试工具:SMU Debug Tool让你的CPU性能尽在掌控
5分钟掌握AMD Ryzen终极调试工具:SMU Debug Tool让你的CPU性能尽在掌控 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目…...
自动化技能备份库的安全分析与工程实践指南
1. 项目概述与核心定位最近在整理一些自动化工具和脚本时,我又翻出了这个叫openclaw/skills的仓库。这其实是一个挺有意思的“数字档案馆”,它的主要作用是把一个特定平台上的“技能”(Skills)给备份下来。简单来说,你…...
PyVisionAI:基于视觉大模型的文档内容智能提取与理解工具
1. 项目概述:PyVisionAI,一个文档内容提取与视觉理解的瑞士军刀如果你经常需要从PDF、PPT、Word文档甚至网页中提取内容,并且希望AI能帮你“看懂”里面的图片和图表,那么PyVisionAI这个工具你应该了解一下。它本质上是一个Python工…...
百度文心一言开发者如何快速接入多模型服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 百度文心一言开发者如何快速接入多模型服务 如果你正在使用百度文心一言的API进行开发,可能会遇到希望尝试其他模型能力…...
如何永久保存微信聊天记录:3步完成专业级数据备份方案
如何永久保存微信聊天记录:3步完成专业级数据备份方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或更换设备,而…...
基于RAG的企业级知识问答系统:从向量检索到LLM生成的完整实践
1. 项目概述:一个AI驱动的企业级知识管理与问答系统最近在GitHub上看到一个挺有意思的项目,叫akshata29/entaoai。乍一看这个名字,可能有点摸不着头脑,但稍微拆解一下就能明白它的核心定位。entaoai,我猜是“Enterpris…...
彻底解决机械键盘连击问题:免费开源工具KeyboardChatterBlocker完全指南
彻底解决机械键盘连击问题:免费开源工具KeyboardChatterBlocker完全指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是…...
claw-installer:构建自动化部署脚本的工程实践与设计哲学
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫claw-installer。这名字乍一看有点抽象,但如果你对自动化部署、特别是那些需要处理复杂依赖和配置的应用感兴趣,那这个工具很可能就是你一直在找的“瑞士军刀”。简单来说ÿ…...
用 C 语言函数表实现通信传输层抽象
用 C 语言函数表实现通信传输层抽象 在嵌入式 Linux 或工业控制类程序中,一个应用经常需要同时接入多种通信链路,例如 UDP、串口、CAN、TCP 或 Unix Socket。 这些链路的底层实现差异很大: UDP 基于 socket串口基于 tty 设备CAN 基于 SocketC…...
