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

Qt中的事件循环

      Qt的事件循环是其核心机制之一,它是一种消息处理机制,负责处理各种事件(如用户输入、定时器、网络请求等)的分发和处理。Qt中的事件循环是一个持续运行的循环,负责接收事件并将它们分发给相应的对象进行处理。当没有事件需要处理时,Qt应用程序会进入一个阻塞状态,直到下一个事件到来。它并不会简单地空转消耗CPU资源,而是会进入一种高效的等待状态。Qt支持嵌套事件循环Qt是事件驱动的

      事件的处理方式可以分为两大类

      (1).需要放入事件队列的事件(异步处理):大多数事件是通过事件队列异步处理的,如用户输入事件(鼠标点击、键盘输入等)、窗口系统事件(重绘请求、窗口调整大小等)、定时器事件(QTimer触发的事件)、网络事件(socket通知等)、跨线程的信号槽调用、使用QCoreApplication::postEvent()发送的事件等。这些事件会被放入事件队列,由事件循环在适当的时候取出并处理。

      (2).不需要放入事件队列的事件(同步处理):有些事件是直接同步处理的,不经过事件队列,如使用sendEvent()发送的事件、信号槽直接连接(Qt::DirectConnection)等。

      主事件循环是Qt应用程序的主线程中第一个启动的事件循环。通常位于main()函数的return app.exec()处。主事件循环的运行时间等于整个应用程序的运行时间,退出主事件循环意味着应用程序即将终止。

      不要阻塞事件循环:不要在事件循环中执行耗时的操作,因为这将导致其他事件无法被处理。将耗时操作移到工作线程,或定期调用processEvents()。阻塞Qt事件循环会导致:用户界面完全冻结(如所有用户输入无响应)、新事件无法被处理(堆积在队列中)等。

      QApplication继承QGuiApplication;QGuiApplication继承QCoreApplication:

      (1).非GUI应用程序使用QCoreApplication类来提供其事件循环。

      (2).对于GUI应用程序使用QGuiApplication类来提供其事件循环。

      (3).对于使用Qt Widgets模块的应用程序使用QApplication类来提供其事件循环。

      通常,建议尽早在main()函数中创建QCoreApplication、QGuiApplication或QApplication对象。exec()直到事件循环退出才会返回,例如,调用quit()时。

      1. QCoreApplication

      对于使用Qt的非GUI应用程序,应该只有一个QCoreApplication对象

      QCoreApplication包含主事件循环(main event loop),其中处理和分发(processed and dispatched)来自操作系统(例如,计时器和网络事件)和其他来源的所有事件。它还处理应用程序的初始化和结束(initialization and finalization),以及系统范围和应用程序范围的设置(system-wide and application-wide settings)。

      事件循环通过调用exec()启动。QCoreApplication启动的事件循环也叫作主事件循环。此函数内会调用QEventLoop::exec()。QEventLoop::exec()是通过循环不断地调用QEventLoop::processEvents()来分发事件队列中的事件。长时间运行的操作可以调用processEvents()来保持应用程序响应。

      提供了几个静态函数:QCoreApplication对象可从instance()获得;可以使用sendEvent()发送事件,或使用postEvent()发布到事件队列;可以使用 removePostedEvents()删除待处理事件,或使用sendPostedEvents()调度待处理事件。

      提供了一个quit()槽和一个aboutToQuit()信号。

      exit(int)函数:调用此函数后,应用程序离开主事件循环并从exec()的调用返回。如果事件循环未运行,则此函数不执行任何操作。此函数不是线程安全的。它只能从主线程(QCoreApplication对象正在处理事件的线程)调用。要让应用程序退出另一个线程,使用QCoreApplication::quit(),或者从主线程使用 QMetaMethod::invokeMethod()调用此函数。

      quit()函数:要求应用程序退出。如果应用程序阻止退出,例如,如果无法关闭其中一个窗口,则可以忽略该请求。应用程序可以通过在应用程序级别(application level)处理QEvent::Quit事件或为各个窗口处理QEvent::Close事件来影响此情况。如果退出未被中断,应用程序将退出并返回代码0(成功)。要退出应用程序而不被中断,直接调用exit()。

      QCoreApplication::notify():将事件发送给接收者:receiver->event(event)。返回从接收者的事件处理程序返回的值。注意,此函数用于发送给任何线程中任何对象的所有事件。对于某些类型的事件(例如鼠标和键盘事件),如果接收者对事件不感兴趣(即返回false),则事件将传播到接收者的父级(propagated to the receiver's parent),依此类推,直到顶层对象(top-level object)。

      2. QGuiApplication

      QGuiApplication包含主事件循环,其中处理和分发来自窗口系统(window system)和其他来源的所有事件。它还处理应用程序的初始化和结束,并提供会话管理(session management)。此外,QGuiApplication处理大多数系统范围和应用程序范围的设置。

      对于使用Qt的任何GUI应用程序,无论应用程序在任何给定时间有0、1、2或更多窗口,都只有一个QGuiApplication对象

      QGuiApplication对象可通过QCoreApplication类的静态函数instance()访问,该函数返回一个与全局qApp指针等效的指针。

      QGuiApplication的主要职责范围:

      (1).它使用用户的桌面设置初始化应用程序,例如palette()、font()和styleHints()。它会跟踪这些属性,以防用户全局更改桌面(例如,通过某种控制面板)。

      (2).它执行事件处理,这意味着它从底层窗口系统接收事件并将它们分发到相关的部件(widgets)。你可以使用sendEvent()和postEvent()向窗口发送自己的事件。

      (3).它解析常见的命令行参数并相应地设置其内部状态。

      (4).它通过translate()提供用户可见的字符串的本地化(localization of strings)。

      (5).它提供了一些神奇对象(magical objects),如clipboard()。

      (6).它了解应用程序的窗口。你可以使用topLevelAt()询问哪个窗口位于某个位置,获取topLevelWindows()列表等。

      (7).它管理应用程序的鼠标光标处理。

      (8).它提供对复杂会话管理(session management)的支持。这使得应用程序可以在用户注销时正常终止,如果无法终止,则可以取消关闭过程,甚至可以为将来的会话保留整个应用程序的状态。

      由于QGuiApplication对象执行了大量初始化操作,因此必须在创建与用户界面相关的任何其他对象之前创建它。QGuiApplication还处理常见的命令行参数。因此,在应用程序本身中对argv进行任何解释或修改之前创建它通常是一个好主意。

      qGuiApp:指向唯一应用程序对象的全局指针。仅当该对象是QGuiApplication时才有效。

      3. QApplication:

      QApplication类管理GUI应用程序的控制流和主要设置。

      QApplication专门化(specializes)了QGuiApplication,并增加了一些基于QWidget的应用程序所需的功能。它处理特定于窗口部件(widget)的初始化和结束。

      对于使用Qt的任何GUI应用程序,无论应用程序在任何给定时间有0、1、2或更多窗口,都只有一个QApplication对象。

      QApplication对象可通过QCoreApplication类的静态函数instance()访问,该函数返回一个与全局qApp指针等效的指针。

      QApplication的主要职责包括:

      (1).它使用用户的桌面设置初始化应用程序,例如palette()、font()和doubleClickInterval()。它会跟踪这些属性,以防用户全局更改桌面(例如,通过某种控制面板)。

      (2).它执行事件处理,这意味着它从底层窗口系统接收事件并将它们分发到相关部件。通过使用sendEvent()和postEvent(),你可以将自己的事件发送到部件。

      (3).它解析常见的命令行参数并相应地设置其内部状态。

      (4).它定义应用程序的外观,封装在QStyle对象中。这可以在运行时使用setStyle()进行更改。

      (5).它提供字符串的本地化,这些字符串可通过translation()供用户查看。

      (6).它提供了一些神奇对象,如clipboard()。

      (7).它了解应用程序的窗口。你可以使用widgetAt()询问哪个部件位于某个位置,获取topLevelWidgets()和closeAllWindows()的列表等。

      (8).它管理应用程序的鼠标光标处理。

      由于QApplication对象执行了大量初始化,因此必须在创建与用户界面相关的任何其他对象之前创建它。QApplication还处理常见的命令行参数。因此,在应用程序本身中对argv进行任何解释或修改之前创建它通常是一个好主意。

      qApp:指向唯一应用程序对象的全局指针。它相当于QCoreApplication::instance(),但转换为QApplication指针,因此仅当唯一应用程序对象是QApplication时才有效。

      Qt中的QApplication类的exec函数启动主事件循环:它启动GUI;它处理信号(signals)并在接收到信号时调用适当的槽(slots);它等待直到调用exit函数并返回在exit中设置的值。

      4. 在Qt中,事件是从抽象的QEvent类派生的对象,表示应用程序内部发生的事情,或应用程序需要了解的外部活动所导致的事情。事件可以由QObject子类的任何实例接收和处理,但它们与部件(widgets)特别相关。Qt中每个事件都是一个QEvent的子类对象。

      (1).事件如何传递:

      当事件发生时,Qt通过构造适当的QEvent子类的实例来创建一个事件对象来表示该事件,并通过调用其event()函数将其传递给QObject的特定实例(或其中一个子类)。

      此函数本身不处理事件;根据传递的事件类型,它调用该特定类型事件的事件处理程序,并根据事件是被接受还是被忽略发送响应。

      某些事件(例如QMouseEvent和QKeyEvent)来自窗口系统;某些事件(例如QTimerEvent)来自其他来源;某些事件来自应用程序本身。

      (2).事件类型:

      大多数事件类型都有特殊类(special classes),特别是QResizeEvent、QPaintEvent、QMouseEvent、QKeyEvent和QCloseEvent。每个类都是QEvent的子类,并添加了事件特定的函数。例如,QResizeEvent添加了size()和oldSize(),以使部件能够发现其尺寸是如何改变的。

      有些类支持不止不一种实际事件类型。QMouseEvent支持鼠标按钮按下、双击、移动和其他相关操作。

      每个事件都有一个关联类型,在QEvent::Type中定义,这可以用作运行时类型信息的便捷来源,以快速确定给定事件对象是由哪个子类构建的。

      由于程序需要以多种复杂的方式做出反应,因此Qt的事件传递机制非常灵活。

      (3).事件处理程序:

      传递事件的正常方式是调用虚函数(virtual function)。例如,QPaintEvent通过调用QWidget::paintEvent()传递。此虚函数负责做出适当的反应,通常是重新绘制窗口部件(widget)。如果你没有在虚函数的实现中执行所有必要的工作,则可能需要调用基类的实现。

      如果你想要替换基类的函数,则必须自己实现所有函数。但是,如果你只想扩展基类的功能,则可以实现所需的函数并调用基类以获取你不想处理的任何情况的默认行为。

      有时,没有这样的事件特定函数(event-specific function),或者事件特定函数不够用。最常见的示例涉及Tab键按下。这些对象可以重新实现 QObject::event()(通用事件处理程序),并在常规处理之前或之后执行事件处理,或者它们可以完全替换该函数。

      注意:对于所有未处理的情况,仍会调用QWidget::event(),并且返回值指示事件是否已被处理;true值可防止将事件发送给其他对象。

      (4).事件过滤器:

      有时,一个对象需要查看并可能拦截传递给另一个对象的事件。例如,对话框通常希望过滤某些部件的按键;例如,修改回车键处理(modify Return-key handling)。

      QObject::installEventFilter()函数通过设置事件过滤器来实现这一点,从而使指定的过滤器对象在其QObject::eventFilter()函数中接收目标对象的事件。事件过滤器可以在目标对象之前处理事件,从而允许其根据需要检查和丢弃事件。可以使用QObject::removeEventFilter()函数删除现有的事件过滤器。

      当调用过滤器对象的eventFilter()实现时,它可以接受或拒绝(accept or reject)事件,并允许或拒绝(allow or deny)进一步处理事件。如果所有事件过滤器都允许进一步处理事件(通过每个都返回false),则事件将发送到目标对象本身。如果其中一个停止处理(通过返回true),则目标和任何后续事件过滤器根本看不到该事件。

      (5).发送事件:

      许多应用程序都希望创建和发送自己的事件。你可以按照与Qt自己的事件循环完全相同的方式发送事件,方法是构造合适的事件对象并使用 QCoreApplication::sendEvent()和QCoreApplication::postEvent()发送它们。

      sendEvent()立即处理事件。当它返回时,事件过滤器和/或对象本身已经处理了该事件。对于许多事件类,有一个名为isAccepted()的函数,它会告诉你事件是否被最后调用的处理程序接受或拒绝。

      postEvent()将事件发布到队列中以供稍后调度。下次Qt的主事件循环运行时,它会调度所有已发布的事件,并进行一些优化。例如,如果有多个调整大小事件,则将它们压缩为一个。这同样适用于绘制事件:QWidget::update()调用postEvent(),这消除了闪烁并通过避免多次重绘来提高速度。

      postEvent()也用于对象初始化,因为发布的事件通常会在对象初始化完成后很快分发(dispatched)。在实现部件时,重要的是要意识到事件可以在其生命周期的早期传递,因此,在其构造函数中,一定要尽早初始化成员变量,以免它有可能接收事件。

      要创建自定义类型的事件,你需要定义一个事件编号(event number),该编号必须大于QEvent::User,并且你可能需要子类化QEvent以传递有关自定义事件的特定信息。

      5. QEventLoop类提供了进入和离开事件循环的方法

      你可以随时创建一个QEventLoop对象并在其上调用exec()来启动本地事件循环。在事件循环中,调用exit()将强制exec()返回。

      QEventLoop::exec():

      (1).进入主事件循环并等待,直到调用exit()。返回传递给exit()的值。

      (2).如果指定了标志,则只处理标志允许的类型的事件。

      (3).必须调用此函数来启动事件处理。主事件循环从窗口系统(window system)接收事件,并将这些事件分发给应用程序部件。

      (4).一般而言,在调用exec()之前不能发生任何用户交互。作为一种特殊情况,可以在调用exec()之前使用QMessageBox等模式部件(modal widgets),因为模式部件使用自己的本地事件循环。

      (5).要使你的应用程序执行空闲处理(即,只要没有待处理事件,就执行特殊函数),使用超时时间为0ns的QChronoTimer。可以使用processEvents()实现更复杂的空闲处理方案。

      注:以上整理的内容主要来自于Qt官方文档

      GitHub:https://github.com/fengbingchun/Qt_Test

相关文章:

Qt中的事件循环

Qt的事件循环是其核心机制之一,它是一种消息处理机制,负责处理各种事件(如用户输入、定时器、网络请求等)的分发和处理。Qt中的事件循环是一个持续运行的循环,负责接收事件并将它们分发给相应的对象进行处理。当没有事件需要处理时&#xff0…...

Android并发编程:线程池与协程的核心区别与最佳实践指南

1. 基本概念对比 特性 线程池 (ThreadPool) 协程 (Coroutine) 本质 Java线程管理机制 Kotlin轻量级并发框架 最小执行单元 线程(Thread) 协程(Coroutine) 创建开销 较高(需分配系统线程资源) 极低(用户态调度) 并发模型 基于线程的抢占式调度 基于协程的协作式调度 2. 核心差异…...

吴恩达深度学习复盘(2)神经网络的基本原理轮廓

笔者注 这两节课主要介绍了神经网络的大的轮廓。而神经网络基本上是在模拟人类大脑的工作模式,有些仿生学的意味。为了便于理解,搜集了一些脑神经的资料,这部分是课程中没有讲到的。 首先要了解一下大脑神经元之间结构。 细胞体&#xff1…...

【redis】集群 数据分片算法:哈希求余、一致性哈希、哈希槽分区算法

文章目录 什么是集群数据分片算法哈希求余分片搬运 一致性哈希扩容 哈希槽分区算法扩容相关问题 什么是集群 广义的集群,只要你是多个机器,构成了分布式系统,都可以称为是一个“集群” 前面的“主从结构”和“哨兵模式”可以称为是“广义的…...

计算机组成原理笔记(六)——2.2机器数的定点表示和浮点表示

计算机在进行算术运算时,需要指出小数点的位置,根据小数点的位置是否固定,在计算机中有两种数据格式:定点表示和浮点表示。 2.2.1定点表示法 一、基本概念 定点表示法是一种小数点的位置固定不变的数据表示方式,用于表示整数或…...

将树莓派5当做Ollama服务器,C#调用generate的API的示例

其实完全没这个必要,性能用脚后跟想都会很差。但基于上一篇文章的成果,来都来了就先简单试试吧。 先来看看这个拼夕夕上五百多块钱能达到的效果: 只要对速度没要求,那感觉就还行。 Ollama默认只在本地回环(127.0.0…...

MYSQL数据库(一)

一.数据库的操作 1.显示数据库 show databases; 2.创建数据库 create database 数据库名; 3.使用数据库 use 数据库名; 4.删除数据库 drop database 数据库名; drop database if exists 数据库名; 二.表的操作 1.显示所有表 show tables; 2.查看表结构 des…...

Python Cookbook-4.15 字典的一键多值

任务 需要一个字典,能够将每个键映射到多个值上。 解决方案 正常情况下,字典是一对一映射的,但要实现一对多映射也不难,换句话说,即一个键对应多个值。你有两个可选方案,但具体要看你怎么看待键的多个对…...

IDEA 终端 vs CMD:为什么 java -version 显示的 JDK 版本不一致?

前言:离谱的 JDK 版本问题 今天遇到了一个让人抓狂的现象:在 Windows 的 CMD 里输入 java -version 和在 IntelliJ IDEA 终端输入 java -version,居然显示了不同的 JDK 版本! 本以为是环境变量、缓存或者 IDEA 设置的问题&#x…...

Flask登录页面后点击按钮在远程CentOS上自动执行一条命令

templates文件夹和app.py在同一目录下。 templates文件夹下包括2个文件:index.html login.html app.py代码如下: import os import time from flask import Flask, render_template, request, redirect, session, make_response import mysql.con…...

深度解析:文件夹变白色文件的数据恢复之道

在数字化时代,数据的重要性不言而喻。然而,当我们在使用计算机时,偶尔会遇到一些棘手的问题,其中“文件夹变白色文件”便是一个令人困惑且亟待解决的难题。这一现象不仅影响了文件的正常访问,更可能隐藏着数据丢失的风…...

【Matlab】-- 基于MATLAB的飞蛾扑火算法与反向传播算法的混凝土强度预测

文章目录 文章目录 01 内容概要02 MFO-BP模型03 部分代码04 运行结果05 参考文献06 代码下载 01 内容概要 本资料介绍了一种基于飞蛾扑火算法(Moth Flame Optimization, MFO)与反向传播算法(Backpropagation, BP)的混凝土强度预…...

【Python实例学习笔记】图像相似度计算--哈希算法

【Python实例学习笔记】图像相似度计算--哈希算法 一、哈希算法的实现步骤:二、对每一步都进行注解的代码 一、哈希算法的实现步骤: 1、缩小尺寸: 将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节&#xff0c…...

2025DevSecOps标杆案例|智能制造国际领导厂商敏捷安全工具链实践

某智能制造国际领导厂商是涵盖智能家居、楼宇科技,工业技术、机器人与自动化和数字化创新业务五大业务板块为一体的全球化科技集团,连续入选《财富》世界500强,每年为全球超过4亿用户、各领域的重要客户与战略合作伙伴提供产品和服务。 数智化…...

【YOLOv11】目标检测任务-实操过程

目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…...

第十七章:Python数据可视化工工具-Pyecharts库

一、Pyecharts简介 资源绑定附上完整资源供读者参考学习! Pyecharts是一个基于百度开源可视化库ECharts的Python数据可视化工具,支持生成交互式的HTML格式图表。相较于Matplotlib等静态图表库,Pyecharts具有以下优势: 丰富的图表…...

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误 环境设置 操作系统: macOS硬件平台: M1 Pro前端框架: Vue 3Node.js 版本: 20 在使用 Vue 项目时,我们尝试集成 vite-plugin-top-level-await 插件以支持顶层 await 语法。然而&#xff…...

《八大排序算法》

相关概念 排序:使一串记录,按照其中某个或某些关键字的大小,递增或递减的排列起来。稳定性:它描述了在排序过程中,相等元素的相对顺序是否保持不变。假设在待排序的序列中,有两个元素a和b,它们…...

六十天前端强化训练之第三十七天之Docker 容器化部署实战指南(大师级详解)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、Docker 核心知识体系 1.1 容器革命:改变开发方式的技术 1.2 Docker 三剑客 1.3 Docker 生命周期管理 1.4 关键命令详解 二、前端容器化实战案例&#xff…...

RabbitMQ--延迟队列事务消息分发

目录 1.延迟队列 1.1应用场景 1.2利用TTL死信队列模拟延迟队列存在的问题 1.3延迟队列插件 1.4常见面试题 2.事务 2.1配置事务管理器 3.消息分发 3.1概念 3.2应用场景 3.2.1限流 3.2.2负载均衡 1.延迟队列 延迟队列(Delayed Queue),即消息被发送以后, 并…...

列表,元组,字典,集合,之间的嵌套关系

在 Python 中,列表、元组、字典和集合的嵌套关系需要遵循各自的特性(如可变性、可哈希性)。以下是它们之间的嵌套规则、示例和典型应用场景的详细梳理: 1. 列表(List)的嵌套 特性: 可变、有序…...

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…...

鸿蒙HarmonyOS NEXT设备升级应用数据迁移流程

数据迁移是什么 什么是数据迁移,对用户来讲就是本地数据的迁移,终端设备从HarmonyOS 3.1 Release API 9及之前版本(单框架)迁移到HarmonyOS NEXT(双框架)后保证本地数据不丢失。例如,我在某APP…...

MCP从零开始

MCP简介 MCP,全称是Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于去年11月正式提出。MCP解决的最大痛点就是Agent开发中调用外部工具的技术门槛过高的问题。 能调用外部工具,是大模型进化为智能体Agent的关…...

Three.js 快速入门教程【十九】CSS2DRenderer(CSS2D渲染器)介绍,实现场景中物体或设备标注标签信息

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

横扫SQL面试——连续性登录问题

横扫SQL面试 📌 连续性登录问题 在互联网公司的SQL面试中,连续性问题堪称“必考之王”。💻🔍 用户连续登录7天送优惠券🌟,服务器连续报警3次触发熔断⚠️,图书馆连续3天人流破百开启限流⚡” …...

爱因斯坦求和 torch

目录 向量点积 矩阵乘法 矩阵转置 向量转换相机坐标系 在 Python 的科学计算库(如 NumPy)中,einsum 是一个强大的函数,它可以简洁地表示各种张量运算。下面是几个不同类型的使用示例: 向量点积 向量点积是两个向量…...

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式,可以从预先定义的模板中创建一个新的 Spring Boot 应用程序,从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr,你…...

【实战】渗透测试下的文件操作

目录 Linux查找文件 Windows查找文件 查找可写目录 windows Linux 创建 Windows Linux 压缩 解压 远程解压文件 Linux查找文件 >find / -name index.php 查找木马文件 >find . -name *.php | xargs grep -n eval( >find . -name *.php | xargs grep -n ass…...

MATLAB 控制系统设计与仿真 - 30

用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入,从而达到伺服控制的效果,我们需要很精确的知道系统的参数模型,否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…...

P1091 [NOIP 2004 提高组] 合唱队形

题目链接: 思路: 题目意思,找出最少的同学出列,保证学生 1-t 上升, t-n 下降。我们只要求出每个点的最长上升子序列和最长不上升子序列,然后总人数-最长上升子序列和最长不上升子序列1,就是最少…...

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…...

通过Spring Boot集成WebSocket进行消息通信

文章目录 通过Spring Boot集成WebSocket进行消息通信1. 创建 Spring Boot 项目2. 添加 WebSocket 依赖3. 配置 WebSocket4. 创建 WebSocket 处理器5. 创建控制器(可选)6. 前端页面测试7. 运行项目注意事项 通过Spring Boot集成WebSocket进行消息通信 1.…...

ComfyUI发展全景:从AI绘画新星到多功能创意平台的崛起

在人工智能技术迅猛发展的浪潮中,ComfyUI作为基于Stable Diffusion的开源工具,已经从最初的AI绘画辅助软件成长为支持多模态创作的强大平台。本文将全面梳理ComfyUI的发展历程、技术特点、应用场景及其在AIGC生态中的独特地位,同时展望这一工…...

11-项目涉及设备的问题

我们部门在开发一些项目时,确实需要借用设备,但每次开发新需求时都要从硬件部门借设备,开发完成后又要归还。这种频繁的借还流程不仅增加了沟通成本,还导致项目负责人和开发人员对设备的功能和应用场景缺乏直观的了解。有时甚至连…...

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中,我们经常使用 Markdown 来记录表格数据。然而,Markdown 格式的表格在实际应用中不如 Excel 方便,特别是需要进一步处理数据时。因此,我们开发了一个使用 wxPython 的 GUI 工具,将 Markdown…...

C++学习之Linux文件编译、调试及库制作

目录 1.rwx对于文件和目录的区别 2.gcc编译过程 3.数据段合并和地址回填说明 4.gcc编译其他参数 5.函数库简介 6.静态库的使用 7.动态库的简介 8.动态库制作基本流程 9.启动APP错误解决方案12 10.启动APP错误解决方案34 11.makefile一组规则 12.makefile的两个函数 …...

neo4j中导入csv格式的三元组数据

csv数据格式: head_entity,relation,tail_entity 02.02类以外的脂肪乳化制品,包括混合的和(或)调味的脂肪乳化制品,允许添加,β-胡萝卜素 02.02类以外的脂肪乳化制品,包括混合的和(或)调味的脂…...

高项第十六章——项目采购管理

什么是采购管理?项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。 项目采购管理包括编制和管理协议所需的管理和控制过程。 16_1 管理基础 什么是协议?协议是用于明确项目初步意向的任何文件或沟通结果,协议的范…...

架构师面试(二十二):TCP 协议

问题 今天我们聊一个非常常见的面试题目,不管前端还是后端,也不管做的是上层业务还是底层框架,更不管技术方向是运维还是架构,都可以思考和参与一下哈! TCP协议无处不在,我们知道 TCP 是基于连接的端到端…...

五.ubuntu20.04 - ffmpeg推拉流以及Nginx、SRS本地部署

一.本地部署nginx 1.编译ffmpeg,参考这位博主的,编译选项有的enable找不到的不需要的可以直接删除,但是像sdl(包含ffplay)、h264、h265这些需要提前下载好,里面都有下载指令。 Ubuntu20.04 编译安装 FFmp…...

JS 手撕题高频考点

前端面试中,JS 手撕题是高频考点,主要考察 编程能力、算法思维、JS 核心知识。以下是最常见的手撕题分类 代码示例: 目录 📌 1. 手写函数柯里化📌 2. 手写 debounce(防抖)📌 3. 手写…...

Hyperlane框架临时上下文数据管理:提升Web开发效率的利器

Hyperlane框架临时上下文数据管理:提升Web开发效率的利器 在现代Web开发中,临时上下文数据管理是实现高效请求处理的关键。Hyperlane框架通过创新的临时上下文存储机制,为开发者提供了一套简洁、安全的解决方案,让数据在请求生命…...

QT操作PDF文件

Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。 1、使用 QPrinter 生成 PDF 2、使用 Qt PDF 模块 (Qt 5.15+) 3、使用第三方库(比如:Poppler) 一、使用 Q…...

【算法手记8】NC95 数组中的最长连续子序列 字母收集

🦄个人主页:修修修也 🎏所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.NC95 数组中的最长连续子序列 题目详情: 题目思路: 解题代码: 二.字母收集 题目详情: 题目思路: 解题代码: 结语 一.NC95 数组中的最长连续子序列 牛客网题目链接(点击即可跳转):NC95 …...

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言:AI渗透测试,安全圈的“新魔法师” 想象一下,你是个网络安全新手,手里攥着一堆工具,正准备硬着头皮上阵。这时,AI蹦出来,拍着胸脯说:“别慌,我3秒扫完漏洞&#xff0…...

使用perf工具分析Linux系统的性能瓶颈

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 使用perf工具分析Linux系统的性能瓶颈 在现代计算系统中,性能瓶颈是一个经常遇到…...

知识就是力量——HELLO GAME WORD!

你好!游戏世界! 简介环境配置前期准备好文章介绍创建头像小功能组件安装本地中文字库HSV颜色空间音频生成空白的音频 游戏UI开发加载动画注册登录界面UI界面第一版第二版 第一个游戏(贪吃蛇)第二个游戏(俄罗斯方块&…...

LeetCode算法题(Go语言实现)_20

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…...

ES拼音分词自动补全实现

#测试拼音分词 POST /_analyze { "text":"如家酒店真不错", "analyzer": "pinyin" } #这里把拼音的首字母放到这里,也说明了这句话没有被分词,而是作为一个整体出现的 #还把每一个字都形成了一个拼音&#…...