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

Qt 线程和 QObjects

线程和 QObjects

        QThread 继承于 QObject。 它发出信号来指示线程开始或结束执行,并提供一些插槽。
更有趣的是,QObjects 可以在多个线程中使用,发出信号以调用其他线程中的插槽,并向 "生活 "在其他线程中的对象发布事件。 之所以能做到这一点,是因为每个线程都可以拥有自己的事件循环。

QObject 重入性

        QObject 是可重入的。它的大多数非图形用户界面子类(如 QTimer、QTcpSocket、QUdpSocket 和 QProcess)也是可重入的,因此可以同时在多个线程中使用这些类。请注意,这些类是为在单个线程中创建和使用而设计的;在一个线程中创建对象并在另一个线程中调用其函数的做法不能保证有效。有三个限制需要注意:

  • QObject 的子对象必须始终在创建父对象的线程中创建。这意味着,除其他事项外,绝不能将 QThread 对象(this)作为在线程中创建的对象的父对象来传递(因为 QThread 对象本身是在另一个线程中创建的)。
  • //Qt 要求QObject的所有子对象都必须和其父对象在同一线程
    class CWorkObject: public QObject{}auto thread = new QThread(this);//线程将会this所在线程执行,不会开启新的线程
    QObject* work = new CWorkObject(thread); //错误,线程对象不能作为另一个线程,子对象work和父对象thread不在同一线程
    QObject* work2 = new CWorkObject(this);//存在父对象,无法移动到线程中
    work2->moveToThread(thread);//错误,work2有父对象this,不能移动到线程里
  • 事件驱动的对象只能在单个线程中使用。具体来说,这适用于定时器机制和网络模块。例如,不能在不是对象所在线程的线程中启动定时器或连接套接字。
  • 在删除 QThread 之前,必须确保删除线程中创建的所有对象。要做到这一点很容易,只要在run()过程中在堆栈上创建对象即可。

         虽然 QObject 是可重入的,但图形用户界面类,尤其是 QWidget 及其所有子类,都不是可重入的。它们只能在主线程中使用。如前所述,QCoreApplication::exec() 也必须在主线程中调用。

       实际上,在主线程之外的其他线程中不可能使用图形用户界面类,这一点很容易解决,方法是将耗时的操作放在单独的工作线程中,当工作线程结束后在主线程的屏幕上显示结果。 这就是实现Mandelbrot示例和Blocking Fortune Client 示例的方法。
        一般来说,不支持在 QApplication 之前创建 QObjects,根据平台的不同,这可能会导致退出时奇怪的崩溃。 这意味着也不支持 QObject 的静态实例。 结构合理的单线程或多线程应用程序应使 QApplication 成为第一个创建和最后一个销毁的 QObject。

每个线程的事件循环

每个线程都可以有自己的事件循环。初始线程使用QCoreApplication::exec() 启动事件循环,对于单对话框图形用户界面应用程序,有时使用QDialog::exec() 启动事件循环。其他线程可以使用QThread::exec() 启动事件循环。与QCoreApplication 一样,QThread 也提供了一个exit(int) 函数和一个quit() 槽。
线程中的事件循环使线程可以使用某些需要存在事件循环的非 GUI Qt 类(如QTimer 、QTcpSocket 和QProcess )。它还可以将任何线程的信号连接到特定线程的槽。下文 "跨线程的信号和槽"部分将对此进行详细说明。

一个QObject 实例可以说是生活在创建它的线程中。该对象的事件由该线程的事件循环调度。QObject 所在的线程可通过QObject::thread() 查看。

QObject::moveToThread() 函数可更改对象及其子对象的线程亲和性(如果对象有父对象,则无法移动)。

拥有对象的线程以外的线程调用delete (QObject )(或以其他方式访问对象)是不安全的,除非你能保证该对象当时没有在处理事件。如果使用QObject::deleteLater() 代替,就会发布一个DeferredDelete 事件,对象线程的事件循环最终会接收到该事件。默认情况下,拥有 QObject 的线程是创建 QObject 的线程,但在调用QObject::moveToThread() 后就不是了。

如果没有事件循环在运行,事件就不会传递给对象。例如,如果在一个线程中创建了QTimer 对象,但从未调用过exec() ,那么QTimer 将永远不会发出timeout() 信号。调用deleteLater() 也不会起作用。(这些限制也适用于主线程)。

您可以使用线程安全函数QCoreApplication::postEvent() 随时向任何线程中的任何对象手动发布事件。事件将由创建对象的线程的事件循环自动派发。

所有线程都支持事件过滤器,但监控对象必须与被监控对象位于同一线程。同样,QCoreApplication::sendEvent() (与postEvent() 不同)只能用于向调用该函数的线程中的对象分派事件。

从其他线程访问 QObject 子类。

QObject 及其所有子类都不是线程安全的。 这包括整个事件传递系统。 重要的是要记住,当你从其他线程访问 QObject 子类时,事件循环可能正在向你的 QObject 子类传递事件。
如果您正在调用 QObject 子类上的函数,而该函数并不在当前线程中,并且该对象可能会接收到事件,那么您必须使用互斥来保护对 QObject 子类内部数据的所有访问;否则,您可能会遇到崩溃或其他不希望发生的行为。
与其他对象一样,QThread 对象存在于创建该对象的线程中,而不是在调用QThread::run() 时创建的线程中。一般来说,在QThread 子类中提供插槽是不安全的,除非使用互斥器保护成员变量。
另一方面,您可以从QThread::run() 实现中安全地发射信号,因为信号发射是线程安全的。

跨线程的信号和插槽

Qt 支持这些信号槽连接类型:

  • Auto Connection (默认)如果信号是在接收对象具有亲和性的线程中发射的,则行为与直接连接相同。否则,行为与队列连接相同"。
  • Direct Connection 当信号发出时,槽会立即被调用。槽在发出者的线程中执行,而发出者不一定是接收者的线程。
  • Queued Connection 当控制返回到接收者线程的事件循环时,槽会被调用。槽在接收者线程中执行。
  • Blocking Queued Connection 槽的调用方式与队列连接相同,只是当前线程会阻塞直到槽返回。

    注意: 使用此类型连接同一线程中的对象会导致死锁。

  • Unique Connection 其行为与自动连接相同,但只有在不重复现有连接的情况下才会建立连接,也就是说,如果同一信号已连接到同一插槽的同一对对象,则不会建立连接,connect() 返回 。false

连接类型可以通过向connect() 传递附加参数来指定。请注意,当发送方和接收方处于不同线程时,如果接收方的线程中正在运行事件循环,那么使用直接连接是不安全的,这与在另一个线程中的对象上调用任何函数都是不安全的道理是一样的。

QObject::connect() 本身是线程安全的。

Mandelbrot示例使用队列连接在工作线程和主线程之间进行通信。为了避免冻结主线程的事件循环(以及应用程序的用户界面),所有的 Mandelbrot 分形计算都是在单独的工作线程中完成的。线程完成分形渲染后会发出一个信号。

同样,Blocking Fortune Client 示例也使用单独的线程与 TCP 服务器进行异步通信。

Qt 模块中的线程支持

线程与 SQL 模块

数据库连接只能在创建它的线程中使用。可以使用QSqlDatabase::moveToThread() 将连接转移到另一个线程中。

此外,QSqlDrivers 使用的第三方库会对在多线程程序中使用 SQL 模块施加更多限制。更多信息请查阅数据库客户端手册。

在线程中绘制

QPainter 可在线程中用于在 QImage、QPrinter、QPicture 和(对于大多数平台)QPixmap 绘画设备上绘画。 不支持绘制到 QWidgets 上。 在 macOS 上,如果从 GUI 线程外打印,将不会显示自动进度对话框。
在任何给定时间内,任意数量的线程都可以进行绘制,但一次只能有一个线程在给定的绘制设备上进行绘制。 换句话说,如果两个线程分别在不同的 QImage 上绘制,它们可以同时绘制,但两个线程不能同时在同一个 QImage 上绘制。

线程和富文本处理

QTextDocument 、QTextCursor 以及所有相关类都是可重入的。

请注意,在图形用户界面线程中创建的QTextDocument 实例可能包含QPixmap 图像资源。请使用QTextDocument::clone() 创建文档副本,并将副本传递给另一个线程进行进一步处理(如打印)。

线程和 SVG 模块

QtSvg 模块中的QSvgGenerator 和QSvgRenderer 类是可重入的。

线程和隐式共享类

Qt 对其许多值类(尤其是QImage 和QString )使用了一种称为隐式共享的优化方法。从 Qt 4 开始,隐式共享类可以像其他值类一样安全地跨线程复制。它们是完全可重入的。隐式共享确实是隐式的

在很多人的印象中,隐式共享和多线程是不相容的概念,因为引用计数通常是这样进行的。然而,Qt 使用原子引用计数来确保共享数据的完整性,避免了引用计数器的潜在损坏。

请注意,原子引用计数并不能保证线程安全。在线程间共享隐式共享类的实例时,应使用适当的锁定。这是对所有重入类的相同要求,无论是否共享。不过,原子引用计数确实能保证在隐式共享类的本地实例上工作的线程是安全的。我们建议使用信号和槽在线程间传递数据,因为这样做无需任何显式锁定。

总而言之,Qt 4 中的隐式共享类确实是隐式共享。即使在多线程应用程序中,您也可以像使用普通的、非共享的、基于值的可重入类一样安全地使用它们。

Threads and QObjects | Qt 6.8

Thread-Support in Qt Modules | Qt 6.8

相关文章:

Qt 线程和 QObjects

线程和 QObjects QThread 继承于 QObject。 它发出信号来指示线程开始或结束执行,并提供一些插槽。 更有趣的是,QObjects 可以在多个线程中使用,发出信号以调用其他线程中的插槽,并向 "生活 "在其他线程中的对象发布事件…...

cocos creator 笔记-路边花草

版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…...

基于SpringBoot+Vue3实现的宠物领养管理平台功能十六

一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…...

MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析

前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN(Modular O…...

数据仓库pinia中,getter和actions有什么区别

将计算逻辑放在 getters 还是 actions 里,取决于具体的使用场景和需求,下面详细分析放在 getters 中的优势以及和 actions 的区别,以说明是否有必要放在 getters 里: 1. getters 的优势 缓存特性 getters 具有类似 Vue 计算属性…...

RoMA: 基于Mamba的遥感基础模型, 已开源, 首次验证mamba的scaling能力

Time: 2025-03-27T15:27:00 github: 链接 HuggingFace: 链接 摘要 近年来,自监督学习在视觉 Transformer(ViT)方面的进展推动了遥感(RS)基础模型的突破。然而,自注意力机制的二次复杂度给可扩展性带来了…...

蓝桥杯(电子类)嵌入式第十一届设计与开发科目模拟试题

一、功能概览 二、分模块实现 1、按键 新建interrupt.h和interrupt.c写中断的代码(写法学习来自定时器-按键单击_哔哩哔哩_bilibili) #ifndef __INTERRUPT_H #define __INTERRUPT_H#include "main.h" #include "stdbool.h"struct…...

CMLINK APN 手动设置

以下是针对 CMLINK 的 APN设置 的详细指南,基于常见配置需求: CMLINK APN 手动设置参数 参数项值说明名称CMLINK (自定义)任意命名(如 CMLINK、CM Internet 等),建议使用ASCII字符,无特殊符号。APNcm.com …...

排序--快排--非递归法

一,引言 快排不管是hoare法还是指针法以及挖坑法,最终都是利用函数递归进行实现的,但是只要是函数递归就会有栈溢出的风险,为此本篇文章讲解快排的非递归法。 二,代码逻辑 首先要了解为什么会使用递归进行调用&…...

02 相机标定相关坐标系

标定相关坐标系 一共四个坐标系 图像像素坐标系: u-v,图像左上角为原点图像物理坐标系: x-y,图像中心为原点...

数学建模:MATLAB卷积神经网络

一、简述 卷积神经网络是一种处理具有网格结构数据的深度学习模型,由输入层、卷积层、池化层、全连接层、输出层组成。 输出层:将图像转换为其对应的由像素值构成的二维矩阵,并存储二维矩阵 卷积层:提取图像的底层特征&#xf…...

Android读写权限分析

Android系统使用的是Linux内核,所以Android系统沿用了linux系统的那一套文件读写权限。 目录 1,权限解读1.1,权限分为三种类型:1.2,权限针对的三类对象:1.3,文件和目录的权限区别1.3.1&#xf…...

计算机网络基础:量子通信技术在网络中的应用前景

计算机网络基础:量子通信技术在网络中的应用前景 一、前言二、量子通信技术基础2.1 量子通信的基本概念2.2 量子通信的主要原理2.2.1 量子密钥分发(QKD)原理2.2.2 量子隐形传态原理三、量子通信技术的特点3.1 绝对安全性3.2 超高通信速率潜力3.3 抗干扰能力强四、量子通信技…...

【算法学习计划】贪心算法(上)

目录 前言(什么是贪心) leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …...

Linux 目录结构(文件系统结构)示例说明

在Linux操作系统中,文件系统的结构是理解系统性能及管理的重要基础。每个目录都有它的特定用途,这使得系统管理更加清晰和高效。本文将带您逐步了解每一个重要目录及其功能。 1. 根目录 / 根目录是Linux文件系统的起点,所有文件和目录均从此…...

Linux下的socket演示程序2

server.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "10.148.4.168" //服…...

TiDB与Doris实操对比:深度剖析数据库选型要点

TiDB与Doris实操对比&#xff1a;深度剖析数据库选型要点 宝子们&#xff0c;在大数据处理的广阔天地里&#xff0c;TiDB和Doris都是备受瞩目的数据库解决方案。它们各自有着独特的优势和适用场景&#xff0c;对于我们开发者来说&#xff0c;深入了解它们的实操特性&#xff0…...

How to install vmware workstation pro on Linux mint 22

概述 VMware 是一家专注于虚拟化技术和云计算解决方案的全球领先软件公司&#xff0c;成立于1998年&#xff0c;总部位于美国加州。它的核心技术是通过“虚拟化”将一台物理计算机的硬件资源&#xff08;如CPU、内存、存储等&#xff09;分割成多个独立的虚拟环境&#xff08;…...

redis常用部署架构之redis分片集群。

redis 3.x版本后开始支持 作用&#xff1a; 1.提升数据读写速度 2..提升可用性 分片集群就是将业务服务器产生的数据储存在不同的机器上。 redis分片集群的架构 如上图所示&#xff0c;会将数据分散存储到不同的服务器上&#xff0c;相比于之前来说&#xff0c;redis要处…...

vim的一般操作(分屏操作) 和 Makefile 和 gdb

目录 一. vim的基本概念 二. vim基础操作 2.1 插入模式 aio 2.2 [插入模式]切换至[正常模式] Esc 2.3[正常模式]切换至[末行模式] shift ; 2.4 替换模式 Shift R 2.5 视图&#xff08;可视&#xff09;模式 (可以快速 删除//注释 或者 增加//注释) ctrl v 三&…...

DeepSeek 为何能在短时间内超过 ChatGPT?—— 技术变革与成本重构的双重胜利

2025 年 1 月 27 日&#xff0c;全球科技圈见证了一个历史性时刻&#xff1a;中国 AI 公司深度求索&#xff08;DeepSeek&#xff09;开发的同名应用&#xff0c;首次登顶美国苹果 App Store 免费下载榜&#xff0c;超越了长期霸榜的 ChatGPT。这一突破不仅打破了美国科技公司在…...

Wireshark学习

Wireshark简介 抓包前 1.打开wireshark得到下面的界面 2.选择菜单栏上捕获-> 选项&#xff0c;勾选WLAN网卡&#xff08;这里需要根据各自电脑网卡使用情况选择&#xff0c;简单的办法可以看使用的IP对应的网卡&#xff09;。点击开始。启动抓包。 3.wireshark启动后&am…...

我的创作纪念日——三周年

大家好&#xff0c;心心念念的三年之气已到&#xff0c;但是我似乎对于博客专家的身份没有那么渴望了哈哈。虽然最近比较忙&#xff0c;但是看到三周年纪念日的通知&#xff0c;还是想写一点什么&#xff0c;并不是因为三周年有多么值得纪念&#xff0c;而是这段时间确实有一些…...

Softmax 回归 + 损失函数 + 图片分类数据集

Softmax 回归 softmax 回归是机器学习另外一个非常经典且重要的模型&#xff0c;是一个分类问题。 下面先解释一下分类和回归的区别&#xff1a; 简单来说&#xff0c;分类问题从回归的单输出变成了多输出&#xff0c;输出的个数等于类别的个数。 实际上&#xff0c;对于分…...

基于云服务器的数仓搭建-hive/spark安装

mysql本地安装 安装流程&#xff08;内存占用200M&#xff0c;升至2.1G&#xff09; # 将资料里mysql文件夹及里面所有内容上传到/opt/software/mysql目录下 mkdir /opt/software/mysql cd /opt/software/mysql/ # 待上传文件 install_mysql.sh mysql-community-client-8.0.3…...

YOLO历代发展 图像增强方式 架构

YOLO1 YOLOV5 数据增强 mosaic 仿射变换(Affine)、透视变换(Perspective) 网络搭建...

Spring AI Alibaba EmbeddingModel使用

一、嵌入模型 (Embedding Model)简介 1、核心概念 嵌入模型&#xff08;EmbeddingModel&#xff09;是嵌入过程中采用的模型。 当前 EmbeddingModel的接口主要用于将文本转换为数值向量&#xff0c;接口的设计主要围绕这两个目标展开&#xff1a; 可移植性&#xff1a; 该接口…...

C++入门五式——类和对象(下)

目录 再探构造函数——初始化列表 类型转换 static成员 友元函数 内部类 匿名对象 再探构造函数——初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&#xff0c;就是初始化列表。 //初始化列…...

Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景

以下是Spring的SPEL&#xff08;Spring Expression Language&#xff09;的使用说明&#xff0c;包含语法、示例和常见场景&#xff1a; 1. 基本语法 变量引用 表达式&#xff1a;#{变量名}&#xff08;如#{systemProperties[os.name]}&#xff09;作用域&#xff1a;在Sprin…...

Linux应用:线程进阶

线程同步之信号量 信号量&#xff08;Semaphore&#xff09;是一个整型的计数器&#xff0c;用于控制对共享资源的访问。它通过 PV 操作来实现同步&#xff0c;P 操作将信号量的值减 1&#xff0c;如果值小于 0 则线程阻塞&#xff1b;V 操作将信号量的值加 1&#xff0c;如果…...

策略模式 (Strategy)

策略模式 (Strategy) 应用场景&#xff1a;用于处理不同的任务配置参数。在你的任务中&#xff0c;可能会有不同的任务类型&#xff0c;每个任务类型可能有不同的单位&#xff08;比如米、毫米&#xff09;或不同的处理方式。策略模式可以让你根据不同的任务类型选择不同的处理…...

【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; YOLOv8改进系列&#xff0…...

mathtype一些用法总结

1.一个是公式旁边加入||&#xff0c;一般使用键盘直接打入的会比较小&#xff0c;mathtype中的会好看很多&#xff0c;打开这个栏目&#xff0c;会看到有很多。 2.另外是带^符号&#xff0c;在字符上面带没有办法直接带&#xff0c;所以可以在mathtype中先加帽子&#xff0c;然…...

1、SQL注入攻击的防范

原文地址: SQL注入攻击的防范 更多内容请关注&#xff1a;代码安全 PHP安全编码——书写安全的代码 1、SQL注入攻击的防范 提问 问题1&#xff1a;什么是SQL注入攻击&#xff1f; 问题2&#xff1a;有几种简单方法防范SQL注入攻击&#xff1f; 问题3&#xff1a;mys…...

核心知识——论文总结

引入 本文我们会针对论文中的核心内容进行总结&#xff0c;加深小伙伴对于Spark的理解。而通过Spark的论文&#xff0c;重点需要掌握理解如下内容&#xff1a; Spark 里核心的 RDD 是一个什么概念&#xff0c;它是通过什么方式来优化分布式数据处理的&#xff0c;它的设计思路…...

HTTP 核心知识点整理

1. HTTP 基础 ​定义&#xff1a;HTTP&#xff08;HyperText Transfer Protocol&#xff09;是应用层协议&#xff0c;基于 ​请求-响应模型&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信。​特点&#xff1a; ​无状态&#xff1a;每次请求独立&a…...

什么是矩阵账号

矩阵账号是指在同一平台或多个平台上&#xff0c;围绕同一品牌或个人&#xff0c;创建的多个相互关联、协同工作的账号组合。这些账号虽然独立&#xff0c;但在内容定位和运营策略上有所区分&#xff0c;同时又相互引流&#xff0c;共同形成一个网络结构&#xff0c;类似于矩阵…...

【6】VS Code 新建上位机项目---项目分层

【6】VS Code 新建上位机项目---项目分层 1 项目分层(layer)2 项目分层实现数据插入SQL3 项目分层实现 (实体类封装参数)4 项目分层的实现SQL查询数据1 项目分层(layer) 表示层(UI):与用户交互使用。比如按钮,输入信息等;业务层(BLL):传递数据,业务逻辑。根据用户需…...

EspressoSample深度解析:在CircleCI上高效运行Android UI测试

项目背景与简介 EspressoSample项目位于GitHub上的circleci/EspressoSample仓库&#xff0c;该项目旨在展示如何在CircleCI平台上配置和使用Espresso进行Android应用的UI测试。 项目结构与环境准备 项目结构 EspressoSample项目遵循典型的Android项目结构&#xff0c;包含a…...

【每日论文】MetaSpatial: Reinforcing 3D Spatial Reasoning in VLMs for the Metaverse

下载PDF或查看论文&#xff0c;请点击&#xff1a; LlamaFactory - huggingface daily paper - 每日论文解读 | LlamaFactory | LlamaFactory探索LlamaFactory&#xff0c;为你解读AI前沿技术文章&#xff0c;快速掌握最新技术动态https://www.llamafactory.cn/daily-paper/de…...

mac m4 Homebrew安装MySQL 8.0

1.使用Homebrew安装MySQL8 在终端中输入以下命令来安装MySQL8&#xff1a; brew install mysql8.0 安装完成后&#xff0c;您可以通过以下命令来验证MySQL是否已成功安装&#xff1a; 2.配置mysql环境变量 find / -name mysql 2>/dev/null #找到mysql的安装位置 cd /op…...

Java关于多态

多态 字面意思&#xff1a;对象的多种形态。 Student(子类)<-Person(父类)->Teacher(子类) Student snew Student(); 学生形态 对象 代表用new创建一个学生对象赋值给Student 类型&#xff0c;代表Student类型(学生对象)现在是学生形态。 有了多态之后&#xff…...

K8S学习之基础四十六:k8s中部署Kibana

部署kibana组件 上传kibina镜像到harbor 部署kibana组件&#xff0c;包括svc和deplomentvi kibana.yaml apiVersion: v1 kind: Service metadata:name: kibananamespace: kube-logginglabels:app: kibana spec:ports:- port: 5601selector:app: kibana --- apiVersion: apps/…...

如何快速对比两个不同的excel文件中的单元格的数据是否完全相同 并把不同的单元格的背景颜色更改为红色?

要快速对比两个不同的Excel文件中的单元格数据是否完全相同&#xff0c;并将不同的单元格背景颜色更改为红色&#xff0c;可以使用Excel的以下几种方法&#xff1a; 方法一&#xff1a;使用条件格式 打开两个Excel文件。将一个文件的内容复制到另一个文件的新工作表中&#x…...

基于Python+LanceDB实战向量搜索

本篇实战演示向量搜索的实现和示例。 预期效果 给出一个查询的字符串&#xff0c;通过向量搜索&#xff0c;在下面三个语句中搜索出关联性最大的那句。 "熊猫是中国的国宝&#xff0c;主要栖息在四川山区。","长城是古代中国建造的军事防御工事&#xff0c;全…...

多路转接epoll

目录 一、为什么epoll最高效&#xff1f; 二、epoll的三个系统调用 三、理解epoll模型 四、epoll的优点 五、epoll的使用示例 六、epoll的工作模式 ET模式和LT模式的对比 七、epoll的使用场景 总结 一、为什么epoll最高效&#xff1f; 按照 man 手册的…...

AI编程工具哪家强?对比Cusor、Copilot、Cline

前言 AI最先革谁的命&#xff1f;刚毕业参加工作的那个时候就在想是否可以开发一个程序让它自己写代码&#xff0c;在那个遥远的年代&#xff0c;这种想法仿佛就是天方夜谭。但是今天大模型的出现让理想成为了现实。回答前面的问题&#xff0c;AI最先革谁的命&#xff0c;最聪…...

[FPGA基础学习]实现流水灯与按键暂停

FPGA实现LED流水灯 1.vscode的安装和使用 vscode下载 Visual Studio Code - Code Editing. Redefined vscode插件&#xff08;Verilog-HDL/SystemVerilog&#xff09;下载 quartus绑定vscode 2.用6个LED完成周期为1秒的跑马灯效果 流水灯模块设计 时钟输入 DE2-115开发板…...

刷题记录(LeetCode 994.腐烂的橘子)

在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…...

ECharts折线图源码合集1(共18个自定义图表),附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我整理了18个自定义折线图图表&#xff0c;不仅对每个图表代码进行了精简优化&#xff0c;剥离冗余配置项&#xff0c;…...