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

QT中多线程写法

转自个人博客:QT中多线程写法

1. QThread及moveToThread()

使用情况:

多使用于需要将有着复杂逻辑或需要一直占用并运行的放入子线程中执行的情况,moveToThread是将整个类的对象移入子线程。

优缺点:

  • 优点:更符合QT的逻辑设计;灵活使用管理线程;将类的任务逻辑与线程逻辑区分开。
  • 缺点:不易于单独对指定函数单独放入子线程,也就不易于将一个类中多个函数放入多个子线程执行。

使用方法:

创建目标类对象后为其创建一个对应的QThread对象,利用信号和槽的机制,将类的执行与线程的触发连接起来,就可以利用开启线程来开始任务的执行。

注意,moveToThread的对象可以是QObject等,但不能是GUI相关的,如QWidget等。

#include <QObject>class worker : public QObject {Q_OBJECT
public:worker(...) {...}public slots:void doWork();
};
#include <QObject>
#include <QThread>class mainClass : public QObject {Q_OBJECT
public slots:mainClass(){m_worker = new worker();m_thread = new QThread();connect(m_thread, &QThread::started, m_worker, &worker::doWork);m_worker->moveToThread(m_thread); // 将类对象移动到子线程中m_thread->start(); //通过线程的开启来执行任务}private:worker *m_worker;QThread *m_thread;};

2. 继承QThread类

2.1 QThread基础使用

使用情况:

  1. 用于自定义QThread类,扩充原始QThread的功能,使其更加满足自己的需求,本质上还是用moveToThread(),只是声明的QThread对象换成了自定义类的对象
  2. 用于直接将需要放入子线程执行的类继承QThread,通过重载run()方法来控制任务的执行等,run()后就直接在子线程中执行任务了。

优缺点:

  • 优点:因为是直接继承整个QThread类,就可以重写其中的函数来实现指定的效果,对线程的控制更为底层,进入子线程的方法更为简单。
  • 缺点:这样也就需要自己把握好对线程生命周期的管理,同时也会将线程逻辑与任务逻辑结合在一起了;且不易于利用信号和槽等机制与其他线程进行通信。

使用方法:

继承QThread,一定需要重载run()来控制任务的运行,只有通过run()运行的任务才是运行在子线程中的

#include <QThread>
#include <QObject>class MyThread : public QThread {Q_OBJECT
public:MyThread(QObject* parent = nullptr) : QThread(parent), m_stop(false) {}void run() override { // 重载run的方法while(m_isRun) {doWoker();}}void stop() {m_isRun = false;}private:void doWoker() {....}private:bool m_isRun = true; // 自定义控制任务的关闭,可以采用其他方法
};
#include <QObject>class mainClass : public QObject {Q_OBJECT
public slots:mainClass(){m_thread = new MyThread();m_thread->start(); // 直接通过start()进行run}private:MyThread *m_thread;};

2.2 QThread类相关方法

  1. run()

    virtual void run();

    程序的入口,自定义多线程时,继承后必须要重载的。通常将任务逻辑写在其中,使用run()运行任务逻辑才能在子线程中运行任务。

  2. *start()

    void start(QThread::Priority priority = QThread::InheritPriority);

    用于启动线程,线程会从run()方法开始执行任务,可以通过设置参数指定线程的优先级,优先级依次递增为:

    • QThread::IdlePriority:最小的优先级
    • QThread::LowestPriority
    • QThread::LowPriority
    • QThread::NormalPriority
    • QThread::HighPriority
    • QThread::HighestPriority
    • QThread::TimeCriticalPriority
    • QThread::InheritPriority:继承父线程的优先级
  3. exec()

    int exec();

    启动线程的事件循环。对于需要在子线程中处理信号和槽的情况,通常需要调用 exec() 来让线程进入事件循环。

  4. exit()

    void exit(int returnCode = 0);

    用于退出线程的事件循环,并将给定的返回码传递给 exec()。这不会立即终止线程,只是结束事件循环。

  5. quit()

    void quit();

    用于安全退出线程的事件循环,与 exit() 类似。它会在事件循环下一次检查事件时退出,并安全地结束线程。

  6. wait()

    bool wait(unsigned long time = ULONG_MAX);

    用于阻塞调用的线程,直到目标线程结束。可以通过设置时间参数来设定最多阻塞的毫秒数。通常用于等待线程的自然结束,确保所有任务执行完毕。

  7. terminate()

    void terminate();

    强制终止线程的执行。这是一个不安全的方法,不会释放线程正在使用的资源,因此尽量避免使用。推荐使用 quit()wait() 的方式来结束线程。

3. QtConcurrent和QFuture

3.1 QtConcurrent基础使用

使用情况:

多使用于需要将单一可调用对象(如函数等)放入子线程执行,可以更便捷地完成简单的并行任务;当对于一个类中,需要对多个方法放入子线程执行,使用这个方法也可以比其他方法更便捷地实现。

优缺点:

  • 优点:使用方法更简便;因为是直接对函数这种对象操作的,对应用场景的要求也就不高,更适用于轻量级并发任务;并且其可以自行管理线程,不需要手动释放等操作;也提供了较多方法可自定义。
  • 缺点:缺少更精细的底层多线程逻辑控制;不适合复杂的任务情景,不易用信号和槽机制。

使用方法:

使用QtConcurrent::run()方法直接将指定函数等对象移动到子线程并执行,调用参数和不调用参数的语法可参考下列示例,当然也支持使用Lambda表达式简洁化函数。

QtConcurrent返回QFuture对象以管理和监控异步任务执行结果,通过QFuture可以获取异步任务执行的结果或状态,绑定一个QFuture对象后可以在主线程任意获取此线程的相关状态。

#include <QObject>class mainClass : public QObject {Q_OBJECT
public slots:mainClass(){// 1.无需调参QtConcurrent::run(this, &mainClass::doWork1); // 2.调用参数,并绑定QFuture对象,获取执行结果int workValue = 10;QFuture<int> futureWork2 = QtConcurrent::run(this, &mainClass::doWork2, workValue); futureWork2.waitForFinished();qDebug() << futureWork2.result();// 3.使用正则Lambda表达式代替目标参数}void doWork1(){...};int doWork2(int value){...};private:MyThread *m_thread;};

3.2 QtConcurrent相关方法

  1. QtConcurrent::run()

    参考3.1,执行单一异步任务。

  2. QtConcurrent::map()

    QFuture<void> map(Sequence<T> &sequence, functor mapFunc)

    对容器sequence中每一个元素都执行mapFunc的并行操作,并且不需要返回结果。sequence是类似于QList之类的容器对象,mapFunc是参数与容器类型Sequence<T> 的T相同的函数。

    void square(int &n) { // 不返回,直接修改参数n = n * n;
    }int main() {QList<int> list = {1, 2, 3, 4, 5};QtConcurrent::map(list, square);for (int i : list) qDebug() << i;return 0;
    }
    
  3. QtConcurrent::mapped()

    QFuture<Sequence<T>> map(Sequence<T> &sequence, functor mapFunc)

    与QtConcurrent::map()类似,但其可以有返回值,返回一个包含各返回值的新容器。

    int square(int n) { // 返回结果return n * n;
    }int main() {QList<int> list = {1, 2, 3, 4, 5};QFuture<QList<int>> future = QtConcurrent::mapped(list, square);future.waitForFinished();QList<int> result = future.result(); // 获取任务运行结果for (int i : result) qDebug() << i;return 0;
    }
    
  4. QtConcurrent::mappedReduced()

    QFuture<Sequence<T>> mappedReduced(Sequence<T> &sequence, functor mapFunc, functor reduceFunc);

    与QtConcurrent::mapped()功能类似,在QtConcurrent::mapped()基础上增加了一个reduceFunc函数,这个方法不再返回返回值构成的新容器,而是利用reduceFunc函数将获取到的返回值进行处理。

    int square(int n) {return n * n;
    }void sum(int &result, const int &value) {result += value;
    }int main() {QList<int> list = {1, 2, 3, 4, 5};QFuture<int> future = QtConcurrent::mappedReduced(list, square, sum);future.waitForFinished();qDebug() << "Sum of squares:" << future.result(); // sum()将各子任务的square()返回值统一处理return 0;
    }
    
  5. QtConcurrent::filter()

    QFuture<void> filter(Sequence<T> &sequence, functor filterFunc);

    可以参考map()去理解,它遍历sequence容器,应用过滤器filterFunc函数,只保留那些满足条件的元素。注意,其通过返回值来进行过滤。

    bool isEven(const int &n) {return n % 2 == 0;
    }int main() {QList<int> list = {1, 2, 3, 4, 5, 6};QtConcurrent::filter(list, isEven);for (int i : list) qDebug() << i; // 输出 2 4 6return 0;
    }
  6. QtConcurrent::filterped()

    QFuture<Sequence<T>> filterped(Sequence<T> &sequence, functor filterFunc);

    参考QtConcurrent::mapped()去理解,即允许由过滤后的返回值构成的新容器。

  7. QtConcurrent::filterpedReduced()

    QFuture<Sequence<T>> filterpedReduced(Sequence<T> &sequence, functor mapFunc, functor reduceFunc);

    参考QtConcurrent::mappedReduced()去理解,即对过滤后的返回值使用reduceFunc函数进行处理。

3.3 QFuture详解

  1. 获取结果方法:result()返回异步任务结果,也即函数的返回值。该函数会判断结果是否为可用的,如果不可用则阻塞等待。如果可用则直接把结果返回。
  2. 设置运行状态方法:cancel()取消任务执行,pause()暂停任务执行,resumes()恢复任务执行。不是所有任务都支持设置运行状态
  3. 获取运行状态方法: isCanceled()检查任务是否被取消,isStarted()检查任务是否开始,isFinished()检查任务是否完成,isRunning()检查任务是否正在运行,isPaused()检查任务是否被暂停。
  4. 获取任务进度信息方法:progressValue()返回任务当前进度,progressMinimum()返回任务进度的最大值,progressMaximum()返回任务进度的最小值。
  5. 其他:上述有些方法在run的时候不一定有用,就可以使用waitForFinished(),阻塞等待直至任务完成时或方法可用时。

4. 附C++方法std::thread的简单使用

C++自带的多线程方法也很简便,但因为目前我使用的不多,故我在这里只是简单介绍一下。

std::thread 在构造时会立即启动线程,在构造时就可以传递一个函数或一个可调用对象(如函数对象或 Lambda表达式)作为线程中需要执行的任务。

在构造完后,可以用以下两种方法选择线程运行模式:

  • join()
    等待线程完成并阻塞当前线程。如果你不 join 一个线程,在程序结束时,未 join 的线程可能会导致程序异常终止。
  • detach()
    将线程与主线程分离,允许它在后台独立执行。使用 detach() 后,主线程不再等待该线程。
#include <iostream>
#include <thread>void square1(int n) { // 传参std::cout << "the square of number : " << n;
}void square2(int &n) { // 引用传参n = n * n;std::cout << "the square of number : " << n;
}int main() {int value = 2;std::thread t1(square1, value);  // 传参t1.join(); // 使用join等待线程结束std::thread t2(square2, std::ref(value));  // 通过std::ref传递引用t2.detach(); // 使用detach分离线程,后台运行return 0;
}

相关文章:

QT中多线程写法

转自个人博客&#xff1a;QT中多线程写法 1. QThread及moveToThread() 使用情况&#xff1a; 多使用于需要将有着复杂逻辑或需要一直占用并运行的类放入子线程中执行的情况&#xff0c;moveToThread是将整个类的对象移入子线程。 优缺点&#xff1a; 优点&#xff1a;更符合…...

css 二维码始终显示在按钮的正下方,并且根据不同的屏幕分辨率自动调整位置

一、需求 “求职入口” 下面的浮窗位置在其正下方&#xff0c;并且浏览器分辨的改变&#xff08;拖动浏览器&#xff09;&#xff0c;位置依旧在最下方 二、实现 <div class"btn_box"><div class"btn_link id"js-apply">求职入口<di…...

STM32 认识STM32

目录 什么是嵌入式&#xff1f; 认识STM32单片机 开发环境安装 安装开发环境 开发板资源介绍 单片机开发模式 创建工程的方式 烧录STM32程序 什么是嵌入式&#xff1f; 1.智能手环项目 主要功能有&#xff1a; 彩色触摸屏 显示时间 健康信息&#xff1a;心率&#…...

关于 CSDN的C知道功能模块 的详细解析,包括 新增的AI搜索(可选深度思考) 和 智能体功能 的具体说明及对比分析

以下是关于 CSDN的C知道功能模块 的详细解析&#xff0c;包括 新增的AI搜索&#xff08;可选深度思考&#xff09; 和 智能体功能 的具体说明及对比分析&#xff1a; 一、C知道核心功能模块详解&#xff08;基础功能&#xff09; &#xff08;参考前文内容&#xff0c;此处略…...

Vue--组件练习案例

图片轮播案例&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Title</title></head><body><!--轮播图片--><div id"app"><h1>轮播图</h1…...

Sentinel源码—1.使用演示和简介一

大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 1.Sentinel流量治理框架简介 (1)与Sentinel相关的问题 …...

空间信息可视化——WebGIS前端实例(二)

技术栈&#xff1a;原生HTML 源代码&#xff1a;CUGLin/WebGIS: This is a project of Spatial information visualization 5 水质情况实时监测预警系统 5.1 系统设计思想 水安全是涉及国家长治久安的大事。多年来&#xff0c;为相应国家战略&#xff0c;诸多地理信息领域的…...

高并发内存池(前言介绍)

高并发内存池项目介绍 1.项目介绍2.项目的知识储备要求3.了解池化技术及内存池4.本次项目中内存池解决的问题5.malloc 1.项目介绍 此项目是实现一个高并发的内存池&#xff0c;它的原型是google的一个开源项目tcmalloc&#xff0c;tcmalloc全程Thread-Caching Malloc&#xff…...

误译、值对象和DDD伪创新-《分析模式》漫谈56

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第14章“类型模型设计模板模式”原文&#xff1a; Examples of such object types are the classic built-in data types of programming environments: inte…...

Java单例模式:实现全局唯一对象的艺术

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c…...

机器学习项目二:帕金森病检测

目录 下载数据 一、导入相关包 二、数据加载 三、特征工程 四、构建模型 五、评估与可视化 六、程序流程 七、完整代码 一、导入相关包 # 导入库部分 import numpy as np # 数值计算基础库 import pandas as pd # 数据处理库 from sklearn.preprocessing import MinMaxS…...

FreeDogs:AI、区块链与迷因文化的深度融合

引言 在 Web3 时代&#xff0c;人工智能&#xff08;AI&#xff09;、区块链技术和迷因文化的结合催生了一种全新的去中心化生态系统。FreeDogs 项目作为这一领域的创新代表&#xff0c;通过独特的技术与文化融合模式迅速受到关注。它利用 AI 驱动的智能营销网络推动迷因文化的…...

《组合优于继承:构建高内聚低耦合模块的最佳实践》

《组合优于继承:构建高内聚低耦合模块的最佳实践》 一、引言:编程范式中的选择 在软件设计中,继承和组合是两个重要的设计模式。继承(Inheritance)常被用来实现代码复用,但滥用继承容易导致脆弱的类层次结构,增加耦合度和维护成本。而组合(Composition)通过将功能分解…...

机器学习02——RNN

一、RNN的基本概念 定义 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种用于处理序列数据的神经网络架构。它与传统的前馈神经网络&#xff08;如多层感知机&#xff09;不同&#xff0c;RNN具有“记忆”功能&#xff0c;能够利用前一时…...

Java基础——面试自我总结

1、String类中常用方法和equals区别 答&#xff1a;对于和equals这两个都是用来比较判断是否相等&#xff0c;其中用来判断两个变量的值是否相等&#xff0c;变量的值的类型分为基本数据类型和引用数据类型。对于&#xff0c;基本数据类型是直接进行值比较&#xff0c;而对于引…...

低功耗设计:Level Shift的种类(以SAED EDK 32/28nm工艺库为例)

在多电压设计中&#xff0c;当信号从一个电压域跨越到另一个电压域时&#xff0c;需要使用电压转换器(Level Shift)。它的工作方式类似于缓冲器&#xff0c;但其输入和输出使用不同的电压&#xff0c;作用是将一个逻辑信号从一个电压转换为另一个电压&#xff0c;并在输入到输出…...

UE5 Chaos :渲染网格体 (Render Mesh) 和模拟网格体 是如何关联的?为什么模拟网格体 可以驱动渲染网格体?

官方文献&#xff1a;https://dev.epicgames.com/community/learning/tutorials/pv7x/unreal-engine-panel-cloth-editor 这背后的核心是一种常见的计算机图形学技术&#xff0c;通常称为代理绑定 (Proxy Binding) 或 表面变形传递 (Surface Deformation Transfer)。 关联机制…...

Fiddler为什么可以看到一次HTTP请求数据?

1、作为代理服务器 Fiddler作为代理服务器&#xff0c;拦截了设备与互联网服务器之间的所有HTTP和HTTPS流量。当客户端&#xff08;如浏览器&#xff09;发送请求时&#xff0c;请求先到达Fiddler&#xff0c;然后由Fiddler转发到目标服务器&#xff1b;服务器的响应也会返回给…...

RAG(Retrieval-Augmented Generation)召回算法是检索增强生成模型中的关键组件

RAG&#xff08;Retrieval-Augmented Generation&#xff09;召回算法是检索增强生成模型中的关键组件&#xff0c;其核心目标是从大规模文档库中高效检索与输入查询相关的信息&#xff0c;以辅助生成模型产生更准确的回答。以下是该算法的关键点解析&#xff1a; ### 1. **核…...

[NOIP 2003 普及组] 栈 Java

import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int n Integer.parseInt(br.readLine());int[] dp new int[n 1];dp[0] 1; // 空序列只有一种…...

5.5 GitHub数据秒级分析核心揭秘:三层提示工程架构设计解析

GitHub Sentinel Agent 分析报告功能设计与实现 关键词:GitHub 数据分析, 提示工程设计, Pull Request 分析, Issues 跟踪, 竞品对比 项目进展报告生成功能设计 报告生成模块是 GitHub Sentinel 的核心功能,通过三层嵌套式提示工程架构实现深度分析: #mermaid-svg-vdHRUan…...

PE文件(十五)绑定导入表

我们在分析Windows自带的一些程序时&#xff0c;常常发现有的程序&#xff0c;如notepad&#xff0c;他的IAT表在文件加载内存前已经完成绑定&#xff0c;存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动&#xff0c;这时程序启动速度变快。但这种方式只适用于…...

如何快速部署基于Docker 的 OBDIAG 开发环境

很多开发者对 OceanBase的 SIG社区小组很有兴趣&#xff0c;但如何将OceanBase的各类工具部署在开发环境&#xff0c;对于不少开发者而言都是比较蛮烦的事情。例如&#xff0c;像OBDIAG&#xff0c;其在WINDOWS系统上配置较繁琐&#xff0c;需要单独搭建C开发环境。此外&#x…...

Multimodal-CoT与MCP的融合医疗AI编程路线探析

引言 在医疗AI领域,多模态数据融合与模块化系统设计是提升诊断精度和临床实用性的关键。Multimodal Chain-of-Thought(Multimodal-CoT)通过构建多源数据的推理链增强决策透明度,而Model Context Protocol(MCP)作为标准化接口协议,为AI系统提供灵活的数据源集成能力。两…...

基于单片机的智能养生油炸炉系统设计与实现

标题:基于单片机的智能养生油炸炉系统设计与实现 内容:1.摘要 本文针对传统油炸炉功能单一、无法满足现代养生需求的问题&#xff0c;设计并实现了基于单片机的智能养生油炸炉系统。通过采用STC89C52单片机作为控制核心&#xff0c;结合温度传感器、液位传感器、继电器等硬件&…...

MySQL流程控制

一&#xff1a;介绍 在 MySQL 中&#xff0c;流程控制语句用于控制存储过程和自定义函数中的程序流程。主要的流程控制语句包括&#xff1a;IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句 &#xff08;1&#xff09;&#xff1a;if条件…...

在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道

如果在show ip route的时候出现没有设置最后的通道Gateway of last resort is not set Switch#show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA exte…...

Java雪花算法

以下是用Java实现的雪花算法代码示例&#xff0c;包含详细注释和异常处理&#xff1a; 代码下面有解析 public class SnowflakeIdGenerator {// 起始时间戳&#xff08;2020-01-01 00:00:00&#xff09;private static final long START_TIMESTAMP 1577836800000L;// 各部分…...

【中大厂面试题】TCP 校招 java 后端最新面试题

TCL&#xff08;一面&#xff09; 1. Spring 初始化Bean前要做什么&#xff1f;有几种方式 在 Spring 容器调用 Bean 的初始化方法&#xff08;如 init-method、PostConstruct 等&#xff09;之前&#xff0c;会按顺序完成以下关键步骤&#xff1a;实例化 → 属性注入 → Aw…...

【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图

背景需求: 用Python,对白色255背景的图片进行了透明化、制作点状或线段的描边裁剪线 【教学类-102-10】剪纸图案全套代码09——Python线条虚线优化版04(原图放大白背景)+制作1图2图6图24图-CSDN博客文章浏览阅读1k次,点赞27次,收藏8次。【教学类-102-10】剪纸图案全套代…...

【数据库系统概论】第3章 SQL(四)视图(超详细)

视图&#xff08;View&#xff09;是数据库中的虚拟表 通过执行查询定义并存储在数据库中&#xff0c;可以像普通表一样被查询和使用。 视图本身并不存储数据&#xff0c;而是基于一个或多个表的查询结果动态生成。 视图的概念 视图( View )是由其它表或视图上的查询所定义…...

HTTP:六.HTTP代理相关介绍

什么是HTTP代理 代理是指获授权代表他人执行操作的人员,代理服务器在在线世界中提供此操作。 代理服务器 充当用户和互联网之间的网关,并防止访问网络以外的任何人。通过 Web 浏览器定期访问互联网,使用户能够直接与网站连接。但是代理充当中间人,代表用户与网页通信。 当…...

【Python爬虫】详细工作流程以及组成部分

目录 一、Python爬虫的详细工作流程 确定起始网页 发送 HTTP 请求 解析 HTML 处理数据 跟踪链接 递归抓取 存储数据 二、Python爬虫的组成部分 请求模块 解析模块 数据处理模块 存储模块 调度模块 反爬虫处理模块 一、Python爬虫的详细工作流程 在进行网络爬虫工…...

深入解析UML图:版本演变、静态图与动态图详解

目录 前言1 UML的版本演变1.1 UML 1.x阶段&#xff1a;统一的开始1.2 UML 2.x阶段&#xff1a;功能的扩展与深化 2 UML图的分类概述3 UML静态图详解3.1 类图&#xff08;Class Diagram&#xff09;3.2 对象图&#xff08;Object Diagram&#xff09;3.3 组件图&#xff08;Comp…...

老旧测试用例生成平台异步任务与用户通知优化

在现代 Web 开发中&#xff0c;异步任务处理和用户通知是两个重要的功能。由于老旧测试平台【测试用例生成平台&#xff0c;源码分享】进行智能化升级后&#xff0c;未采用异步任务处理&#xff0c;大模型推理时间较长&#xff0c;导致任务阻塞&#xff0c;无法处理其他任务&am…...

数据结构初阶:队列

本篇博客主要讲解队列的相关知识。 目录 1.队列 1.1 概念与结构 1.2 队列头文件&#xff08;Queue.h&#xff09; 1.2.1 定义队列结点结构 1.2.2 定义队列的结构 1.3 队列源代码&#xff08;Queue.h&#xff09; 1.3.1 队列的初始化 1.3.2 队列的销毁 1.3.3 入队---队尾 1…...

苍穹外卖。12 数据统计

12.1 工作台 12.1.1 需求分析与设计 12.1.2 代码导入 12.1.3 测试 测试通过 12.2 Apache POI 12.2.1 需求分析与设计 12.2.2 案例 column表示索引行...

WebSocket 和 HTTP长轮询

一、HTTP长轮询&#xff08;Long Polling&#xff09; 1. 工作原理 传统轮询&#xff08;低效&#xff09;&#xff1a;客户端每隔几秒向服务器发一次请求&#xff0c;问“有新数据吗&#xff1f;”&#xff0c;即使服务器没有数据也会立即返回“无”。长轮询&#xff08;改进…...

高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第三章微分中值定理与导数的应用同步测试卷 B 卷

第三章微分中值定理与导数的应用同步测试卷 B 卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15 分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计 3…...

生成式引擎优化(GEO)发展史与行业标准演变

一、生成式引擎优化&#xff08;GEO&#xff09;发展史与行业标准演变 随着 ChatGPT、Bard、Claude、文心一言等生成式AI搜索产品快速发展&#xff0c;GEO&#xff08;Generative Engine Optimization&#xff0c;生成式引擎优化&#xff09;也应运而生&#xff0c;成为继SEO、…...

美客多自养号测评技术解析:如何低成本打造安全稳定的测评体系

美客多&#xff08;MercadoLibre&#xff09;自养号测评系统的搭建需综合考虑硬件、软件、网络环境及操作流程的合规性&#xff0c;以下是基于多篇行业指南整理的核心步骤与要点&#xff1a; 一、前期规划与准备 1. 明确目标与规则 • 确定测评目的&#xff08;如提升产品曝…...

STM32单片机入门学习——第36节: [11-1] SPI通信协议

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.14 STM32开发板学习——第36节: [11-1] SPI通信协议 前言开发板说明引用解答和科普一…...

Qt QML - qmldir使用方法详解

以实际例子看qmldir的使用 1.搞一个qmldir2.让QML找到你的qmldir &#xff08;重点&#xff09;.pro 工程文件QQmlApplicationEngine加载主QML处 3.用起来你的模块 qmldir是Qt QML模块化的基石&#xff0c;其设计初衷是为解决QML文件的组织、复用和依赖管理问题,。只需要在每个…...

AI大模型赋能工业制造:智能工厂的全新跃迁路径

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言:从自动化到智造化,工业领域的AI革命正悄然发生 在过去几十年中,制造业经历了机械化、电气化和自动化三次浪潮。如今,第四次工业革命——以人工智能、大数据、云计算、物联网为代表的“工业…...

LanDiff:赋能视频创作,语言与扩散模型的融合力量

自从 Wan 2.1 发布以来&#xff0c;AI 视频生成领域似乎进入了一个发展瓶颈期&#xff0c;但这也让人隐隐感到&#xff1a;“DeepSeek 时刻”即将到来&#xff01;就在前几天&#xff0c;浙江大学与月之暗面联合推出了一款全新的文本到视频&#xff08;T2V&#xff09;生成模型…...

Windows 图形显示驱动开发-WDDM 1.2功能~显示设备的容器id支持

容器 ID 设备驱动程序接口 (DDI) 在显示微型端口驱动程序中实现此函数和结构&#xff1a; DxgkDdiGetChildContainerIdDXGK_CHILD_CONTAINER_ID 容器 ID 说明 监视设备中的新功能可以提供更好的用户体验。 具体而言&#xff0c;通用串行总线 (USB) 集线器是监视器上用于连…...

基于PyQt5和OpenCV的传统图像分割应用UI程序

目录 1. 程序概述 2. 用户界面设计 主窗口布局 图像显示区域 控制面板区域 3. 核心功能实现 图像处理功能 关键方法 4. 特色实现 区域生长算法改进 分水岭算法改进 GrabCut算法改进 5. 用户体验优化 6. 技术栈 7. 使用说明 8. 完整代码 9. 测试结果 本文实现了…...

java使用HTTP实现多线程爬取数据

Java中使用HTTP多线程爬取数据。首先&#xff0c;我得理解他们的需求。可能想要高效地抓取大量网页数据&#xff0c;而单线程可能不够快&#xff0c;所以需要多线程来提高效率。不过&#xff0c;多线程爬虫需要考虑的问题挺多的&#xff0c;比如线程安全、请求频率控制、异常处…...

08【基础学习】串口通信(三):收发数据包+数据校验

收发数据包数据校验 1、和校验异或校验1.1、HEX固定长度数据包校验1.2、HEX不固定长度数据包校验 2、CRC校验 1、和校验异或校验 和校验&#xff1a;将接收到的数据全部相加后&#xff0c;取结果的最后一个字节的数据 异或校验&#xff1a;将接收到的数据全部相异或后&#xff…...

已开源!CMU提出NavRL :基于强化学习的无人机自主导航和动态避障新方案

导读在无人机技术快速发展的今天&#xff0c;如何确保无人机在复杂动态环境中的安全飞行成为一个关键挑战。传统的导航方法通常将决策过程分解为预测和规划两个独立模块&#xff0c;这种手工设计的系统虽然在特定环境中表现良好&#xff0c;但当环境条件发生变化时&#xff0c;…...