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

C++上位机软件工程师面试记录

目录一1. Qt 常用多线程类有哪些2. Qt 多线程不重写 run() 如何使用3. TCP 粘包、半包问题如何处理4. TCP 与 UDP 有什么区别5. TCP 三次握手、四次挥手基本原理6. Modbus RTU 和 Modbus TCP 区别7. SQLite 数据库使用相关8. SQLite 常用查询语句与优化方案9. 数据库添加索引存在哪些缺点10. 项目中如何解决 UDP 丢包问题1. Qt 常用多线程类有哪些2. Qt 多线程不重写 run() 如何使用3. TCP 粘包、半包问题如何处理4. TCP 与 UDP 有什么区别5. TCP 三次握手、四次挥手基本原理6. Modbus RTU 和 Modbus TCP 区别7. SQLite 数据库使用相关8. SQLite 常用查询语句与优化方案9. 数据库添加索引存在哪些缺点10. 项目中如何解决 UDP 丢包问题一1. Qt 常用多线程类有哪些Qt 中实现多线程主要有三种方式QThread最基础、最底层的线程类适合需要长期在后台运行的守护任务如持续的串口数据接收或网络监听。QRunnable结合QThreadPool适合处理大量轻量级、短暂并发的计算任务。将任务封装在QRunnable中丢给线程池自动调度缺点是它不是QObject的子类不能直接使用信号与槽与 GUI 线程通信。QtConcurrent高级多线程 API。可以通过QtConcurrent::run()极其方便地将一个普通函数丢到子线程执行底层也是基于线程池的封装。2. Qt 多线程不重写 run() 如何使用在工业级 Qt 开发中强烈推荐使用“Worker-Object”模式而不是去重写run()。 具体做法创建一个继承自QObject的 Worker 类把耗时的业务逻辑写在它的槽函数中。实例化一个标准的QThread和一个 Worker 对象调用worker-moveToThread(thread)将对象移入子线程。最后通过信号与槽机制去触发 Worker 执行任务任务完成后再通过信号将结果返回给 GUI 主线程。这种做法完全贴合 Qt 的事件循环Event Loop机制安全且解耦。3. TCP 粘包、半包问题如何处理TCP 是面向字节流的协议底层没有“数据包”的边界概念所以在项目开发中必然会遇到粘包或半包。 我的处理方案是自定义应用层协议配合状态机机制。常见的做法是采用“包头 包体”格式。设计一个固定长度的包头其中包含特殊的同步标识符和“包体长度”字段。接收端开辟一个本地数据缓存区Buffer利用状态机解析先读取并校验定长的包头解析出后续包体需要多长只有当缓存区里的数据量大于等于这个总长度时才将这一整帧数据提取出来进行业务处理剩余数据留在缓存区等待下一次拼接。4. TCP 与 UDP 有什么区别TCP是面向连接的、可靠的流协议。它有确认应答、超时重传、拥塞控制等机制保证数据不丢包、不乱序。缺点是协议头部大建立连接有开销速度相对慢。工程上常用于传文件、下发严谨的控制指令。UDP是无连接的、尽最大努力交付的数据报协议。它不保证可靠性发出去就不管了可能丢包或乱序。优点是开销极小速度快实时性好。常用于视频流传输、心跳包或高频的设备状态广播。5. TCP 三次握手、四次挥手基本原理三次握手建立连接客户端发 SYN服务端回 SYNACK客户端再回 ACK。核心目的是验证双方的发送和接收能力都正常并同步双方的初始序列号为可靠传输打好基础。四次挥手断开连接因为 TCP 是全双工的双向都可以发数据所以需要单向分别关闭通道。一方发 FIN 申请关闭它的发送通道另一方回 ACK 确认等另一方把手里剩下的数据也发完后也发 FIN 申请关闭最先发起方回 ACK并等待 2MSL报文最大生存时间后彻底断开防止最后的 ACK 丢失。6. Modbus RTU 和 Modbus TCP 区别Modbus 是一种极为经典的工业控制协议。底层物理链路不同RTU 通常基于串口通信如 RS-485/RS-232而 TCP 基于以太网和 TCP/IP 协议栈。报文结构不同RTU 报文包含“设备从站地址”以及结尾严格的“CRC 校验码”因为串口通信易受电磁干扰。而 Modbus TCP 报文去掉了从站地址和 CRC 校验因为底层的局域网交换机和 TCP 协议已经保证了准确到达和数据完整性并在报文头部增加了一个 7 字节的 MBAP 报文头包含事务元标识符等信息。7. SQLite 数据库使用相关SQLite 是一个非常轻量的、无服务端的本地关系型数据库无需配置数据就是一个本地文件。在上位机开发中非常适合用来做日志系统的持久化存储或设备本地参数配置。 在项目中结合 Qt 开发时通常使用QSqlDatabase建立连接用QSqlQuery执行 SQL 语句。如果涉及海量历史数据的可视化可以将其与 Qt 的 Model/View 架构如QSqlTableModel结合实现数据的按需懒加载和界面的流畅渲染。8. SQLite 常用查询语句与优化方案常用语句主要是SELECT,INSERT,UPDATE,DELETE配合WHERE过滤、ORDER BY排序和LIMIT分页。工程级优化方案使用事务Transaction这是 SQLite 最有效的提速手段。如果是批量插入上千条状态数据一定要用BEGIN和COMMIT将这些INSERT包裹起来能将磁盘 I/O 减少到仅有一次速度提升成百上千倍。预编译语句与绑定参数使用prepare()和bindValue()来执行 SQL。既可以防止 SQL 注入攻击又能提高数据库引擎解析语句的效率。合理建索引对经常用作WHERE查询条件的字段建立索引。9. 数据库添加索引存在哪些缺点索引虽然能大幅提高查询速度但代价是空间开销索引文件本身需要占用额外的物理存储空间。写降速与维护成本当对数据表进行INSERT、UPDATE、DELETE操作时数据库还需要动态去维护和更新索引树这会明显拖慢写入速度。因此不能滥用索引对于频繁更新的列、或者数据重复度极高如“性别”、“布尔值”的列不应建立索引。10. 项目中如何解决 UDP 丢包问题如果受限于硬件或网络环境必须使用 UDP但又要求不丢包就必须在应用层自己实现一套类似于 TCP 的可靠传输机制即 ARQ 机制序列号机制在发送的自定义包头中加入Sequence Number接收端据此判断包是否连续、有无乱序或重复。确认应答ACK接收端收到包后必须向发送端回复一个对应的 ACK 包。超时重传发送端维护一个定时器发包后如果在指定时间内没有收到 ACK就将该包重发。 在实际工程落地中如果我们不想从零手写通常会直接移植引入开源的KCP 协议它就是一套纯算法级的可靠 UDP 传输协议在网络拥堵时比 TCP 延迟更低。1. Qt 常用多线程类有哪些Qt 中实现多线程主要有三种方式QThread最基础、最底层的线程类适合需要长期在后台运行的守护任务如持续的串口数据接收或网络监听。QRunnable结合QThreadPool适合处理大量轻量级、短暂并发的计算任务。将任务封装在QRunnable中丢给线程池自动调度缺点是它不是QObject的子类不能直接使用信号与槽与 GUI 线程通信。QtConcurrent高级多线程 API。可以通过QtConcurrent::run()极其方便地将一个普通函数丢到子线程执行底层也是基于线程池的封装。2. Qt 多线程不重写 run() 如何使用在工业级 Qt 开发中强烈推荐使用“Worker-Object”模式而不是去重写run()。 具体做法创建一个继承自QObject的 Worker 类把耗时的业务逻辑写在它的槽函数中。实例化一个标准的QThread和一个 Worker 对象调用worker-moveToThread(thread)将对象移入子线程。最后通过信号与槽机制去触发 Worker 执行任务任务完成后再通过信号将结果返回给 GUI 主线程。这种做法完全贴合 Qt 的事件循环Event Loop机制安全且解耦。3. TCP 粘包、半包问题如何处理TCP 是面向字节流的协议底层没有“数据包”的边界概念所以在项目开发中必然会遇到粘包或半包。 我的处理方案是自定义应用层协议配合状态机机制。常见的做法是采用“包头 包体”格式。设计一个固定长度的包头其中包含特殊的同步标识符和“包体长度”字段。接收端开辟一个本地数据缓存区Buffer利用状态机解析先读取并校验定长的包头解析出后续包体需要多长只有当缓存区里的数据量大于等于这个总长度时才将这一整帧数据提取出来进行业务处理剩余数据留在缓存区等待下一次拼接。4. TCP 与 UDP 有什么区别TCP是面向连接的、可靠的流协议。它有确认应答、超时重传、拥塞控制等机制保证数据不丢包、不乱序。缺点是协议头部大建立连接有开销速度相对慢。工程上常用于传文件、下发严谨的控制指令。UDP是无连接的、尽最大努力交付的数据报协议。它不保证可靠性发出去就不管了可能丢包或乱序。优点是开销极小速度快实时性好。常用于视频流传输、心跳包或高频的设备状态广播。5. TCP 三次握手、四次挥手基本原理三次握手建立连接客户端发 SYN服务端回 SYNACK客户端再回 ACK。核心目的是验证双方的发送和接收能力都正常并同步双方的初始序列号为可靠传输打好基础。四次挥手断开连接因为 TCP 是全双工的双向都可以发数据所以需要单向分别关闭通道。一方发 FIN 申请关闭它的发送通道另一方回 ACK 确认等另一方把手里剩下的数据也发完后也发 FIN 申请关闭最先发起方回 ACK并等待 2MSL报文最大生存时间后彻底断开防止最后的 ACK 丢失。6. Modbus RTU 和 Modbus TCP 区别Modbus 是一种极为经典的工业控制协议。底层物理链路不同RTU 通常基于串口通信如 RS-485/RS-232而 TCP 基于以太网和 TCP/IP 协议栈。报文结构不同RTU 报文包含“设备从站地址”以及结尾严格的“CRC 校验码”因为串口通信易受电磁干扰。而 Modbus TCP 报文去掉了从站地址和 CRC 校验因为底层的局域网交换机和 TCP 协议已经保证了准确到达和数据完整性并在报文头部增加了一个 7 字节的 MBAP 报文头包含事务元标识符等信息。7. SQLite 数据库使用相关SQLite 是一个非常轻量的、无服务端的本地关系型数据库无需配置数据就是一个本地文件。在上位机开发中非常适合用来做日志系统的持久化存储或设备本地参数配置。 在项目中结合 Qt 开发时通常使用QSqlDatabase建立连接用QSqlQuery执行 SQL 语句。如果涉及海量历史数据的可视化可以将其与 Qt 的 Model/View 架构如QSqlTableModel结合实现数据的按需懒加载和界面的流畅渲染。8. SQLite 常用查询语句与优化方案常用语句主要是SELECT,INSERT,UPDATE,DELETE配合WHERE过滤、ORDER BY排序和LIMIT分页。工程级优化方案使用事务Transaction这是 SQLite 最有效的提速手段。如果是批量插入上千条状态数据一定要用BEGIN和COMMIT将这些INSERT包裹起来能将磁盘 I/O 减少到仅有一次速度提升成百上千倍。预编译语句与绑定参数使用prepare()和bindValue()来执行 SQL。既可以防止 SQL 注入攻击又能提高数据库引擎解析语句的效率。合理建索引对经常用作WHERE查询条件的字段建立索引。9. 数据库添加索引存在哪些缺点索引虽然能大幅提高查询速度但代价是空间开销索引文件本身需要占用额外的物理存储空间。写降速与维护成本当对数据表进行INSERT、UPDATE、DELETE操作时数据库还需要动态去维护和更新索引树这会明显拖慢写入速度。因此不能滥用索引对于频繁更新的列、或者数据重复度极高如“性别”、“布尔值”的列不应建立索引。10. 项目中如何解决 UDP 丢包问题如果受限于硬件或网络环境必须使用 UDP但又要求不丢包就必须在应用层自己实现一套类似于 TCP 的可靠传输机制即 ARQ 机制序列号机制在发送的自定义包头中加入Sequence Number接收端据此判断包是否连续、有无乱序或重复。确认应答ACK接收端收到包后必须向发送端回复一个对应的 ACK 包。超时重传发送端维护一个定时器发包后如果在指定时间内没有收到 ACK就将该包重发。 在实际工程落地中如果我们不想从零手写通常会直接移植引入开源的KCP 协议它就是一套纯算法级的可靠 UDP 传输协议在网络拥堵时比 TCP 延迟更低。11. 介绍Qt中事件循环机制。在 Qt 中事件循环的本质就是一个无限循环的死循环结构它的核心作用是拦截、分发和处理来自操作系统、硬件或者程序内部产生的各种事件以此来驱动整个 GUI 程序的运行。从底层机制来看当我们在主函数中调用QApplication::exec()时其实就是开启了这个事件循环对应底层QEventLoop类。 它的工作流程可以通俗地理解为一个‘处理队列’的过程产生与排队无论是用户的鼠标点击、键盘输入还是底层的网络数据到达、定时器超时都会被封装成QEvent对象放入事件队列中。分发主线程在这个死循环中不断检查队列。如果队列有事件就会将其取出交由具体的事件分发器如notify()去路由。处理事件最终会被派发给目标对象QObject及其子类的event()函数再由具体的事件处理函数比如mousePressEvent或者触发关联的槽函数来执行具体的业务逻辑。休眠如果队列为空事件循环并不会一直消耗 CPU而是将线程挂起休眠直到下一个新事件到来把它唤醒。”

相关文章:

C++上位机软件工程师面试记录

目录 (一) 1. Qt 常用多线程类有哪些? 2. Qt 多线程不重写 run() 如何使用? 3. TCP 粘包、半包问题如何处理? 4. TCP 与 UDP 有什么区别? 5. TCP 三次握手、四次挥手基本原理 6. Modbus RTU 和 Modbus TCP …...

收藏!小白程序员必看:如何用RAG让大模型秒变“知识达人”

大模型虽强但知识易过时且难接入私有信息。RAG通过检索增强生成,为模型加装“搜索引擎”和“知识库”,解决时效性、私有数据接入和答案追溯问题。RAG分为朴素、高级、模块化及智能体阶段,对AI初学者而言,它是让大模型落地企业场景…...

腾讯元宝生成的很多公式,复制到WORD中会乱码,我应该怎么做?

从“公式乱码”到“无损流转”:企业级AI导出工程的架构实践与反思 当AI生成的专业内容在复制粘贴中“死”于格式鸿沟,我们需要的不只是工具,而是一套结构化数据流转范式。 一、痛点复盘:一个架构师眼中的“乱码危机” 在AI辅助研…...

一次业务接口性能评估的总结

一次业务接口性能评估的总结 本篇文章是我在项目中对一个业务接口做性能评估时,对一些问题的思考和相关知识点系统性回顾拾遗的一个总结。 业务背景 我们项目中的一个文件上传接口,主要业务功能是接收第三方渠道端上传的base64编码影像文件和相关业务数据…...

【运维必备Linux系统知识】

文章目录一、Linux系统整体结构1、核心特点2、常见发行版3、主要应用场景4、目录结构5、系统核心组成二、Linux基础必备命令1、目录与文件操作2、文件查看与编辑3、文件查找与搜索4、系统信息查看5、用户与权限管理6、进程管理7、网络常用命令8、打包压缩与解压9、系统开关机&a…...

Scalify:基于e-graph与符号推理的分布式机器学习静默错误检测工具

1. 项目概述与核心挑战在分布式机器学习的世界里,我们常常需要将一个庞大的模型拆解,分散到成百上千个计算设备(GPU、TPU、Neuron Core)上并行执行,以应对模型参数量和数据量的爆炸式增长。这个过程,我们称…...

避坑指南:Linux V4L2采集图像时,为什么你的JPG文件总是打不开?

深度解析:Linux V4L2图像采集中JPG文件损坏的五大根源与解决方案当你在Linux环境下使用V4L2框架进行图像采集时,是否遇到过这样的场景:代码编译运行一切顺利,生成的JPG文件却无法打开,报错"Not a JPEG file"…...

从备份到部署:用Clonezilla为网吧/机房批量克隆系统镜像的实战流程

从备份到部署:用Clonezilla为网吧/机房批量克隆系统镜像的实战流程在网吧、学校机房或企业IT部门中,面对数十台甚至上百台配置相同的计算机,如何高效完成系统部署和环境统一?传统逐台安装的方式不仅耗时费力,还难以保证…...

在Ubuntu 22.04上,用AutoDockTools给蛋白-小分子做对接,保姆级避坑指南

在Ubuntu 22.04上,用AutoDockTools给蛋白-小分子做对接,保姆级避坑指南1. 环境准备与依赖安装Ubuntu 22.04 LTS作为长期支持版本,其稳定性非常适合科研计算。但首次使用时,需要确保系统环境完整。打开终端(CtrlAltT&am…...

从lsusb输出到硬件信息库:如何查询Linux中USB设备的厂商和型号

从lsusb输出到硬件信息库:Linux下USB设备厂商与型号的深度解析 当你插入一个陌生的USB设备到Linux系统时,终端里 lsusb 命令输出的那一串神秘代码 ID xxxx:xxxx 往往让人摸不着头脑。这些十六进制数字背后隐藏着设备的真实身份——厂商和具体型号。本…...

机器学习赋能冷等离子体种子处理:Extra Trees模型精准预测发芽率提升

1. 项目概述与核心价值 在精准农业的探索前沿,我们常常面临一个看似简单却极其关键的挑战:如何在不损伤种子的前提下,有效提升其发芽率和幼苗活力?传统方法依赖大量重复的田间试验,周期长、成本高,且结果受…...

使用vscode 搭建Java 开发环境

vscode 是一款开源,免费的代码编译环境,有丰富的插件可以选择,这篇文章就从配置Java环境介绍一下vscode使用的原理。 下载配置Java 从官网下载jdk安装了之后,直接安装即可,这里我安装了jdk1.8和jdk22,这里…...

宇视VM易用性推宣-电视墙自动切换主辅码流

宇视VM易用性推宣-电视墙自动切换主辅码流 一.功能介绍本文主要介绍B3359P30版本VM新特性功能:解码拼控电视墙自动切换主辅码流。二.配置步骤1、登录VM首页,选择设备管理页签,在界面左侧菜单列表选择终端设备&#xff…...

告别卡顿!深度解析麒麟V10桌面版mate-indicators与auditd内存飙升的关联与根治

麒麟V10桌面版性能优化实战:解决mate-indicators与auditd内存异常问题最近有不少麒麟V10桌面版用户反馈系统运行一段时间后变得异常卡顿,打开系统监视器查看,发现mate-indicators或auditd进程的内存占用居高不下,有时甚至达到几个…...

量子机器学习预测误差:从T/N线性关系到紧致界理论突破

1. 量子机器学习预测误差:从理论到实践的深度解析在量子机器学习这个前沿交叉领域,我们常常面临一个核心挑战:如何评估一个在有限数据上训练出的量子模型,面对全新未知数据时的真实表现?这不仅是理论研究者关心的课题&…...

Java YOLO推理精度漂移终极解决方案:从预处理到后处理的工业级优化指南

做Java+YOLO工业部署的朋友,相信都遇到过这个噩梦:Python端训练时mAP高达90%,导出ONNX模型到Java端一跑,精度直接掉到60%甚至更低,同一个目标在Python里置信度0.9,到Java里只有0.3,检测框要么飘到天边,要么同一个目标出好几个框。 我在汽车零部件质检项目上就踩过这个…...

基于大语言模型的表位智能设计与筛选:epiGPTope项目解析

1. 项目概述与核心挑战在免疫学和生物技术领域,表位(Epitope)的发现与设计一直是一个核心且充满挑战的课题。简单来说,表位就是抗原(如病毒、细菌表面的蛋白质)上那一小段能被我们免疫系统(抗体…...

基于经典机器学习模型的GitHub代码审查评论情感分析实践

1. 项目概述:为什么我们需要分析代码审查评论的情感?在软件开发的日常协作中,代码审查(Code Review)是保证代码质量、促进知识共享和团队协作的核心环节。然而,审查过程不仅仅是技术逻辑的校验,…...

强化学习赋能匹配滤波器:可解释心电R波检测新范式

1. 项目概述:当经典匹配滤波器遇上强化学习在生物医学信号处理,尤其是心电分析这个行当里,R波的精准检测是几乎所有后续分析的基石。无论是计算心率、分析心率变异性,还是筛查心律失常,第一步都是把那些尖尖的R波从嘈杂…...

mysql视图和用户管理

视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。视图很简单,就是把我们后面的select之前我们使用的时候是形成一…...

ARM SME指令集与MOVA指令详解:矩阵运算优化

1. ARM SME指令集概述在当今计算密集型应用如机器学习、信号处理和科学计算的推动下,现代处理器架构不断扩展其并行计算能力。ARMv9架构引入的SME(Scalable Matrix Extension)正是这种演进的典型代表,它为矩阵和向量操作提供了硬件…...

跨VM RowHammer攻击防御技术与DRAM安全研究

1. 跨VM RowHammer攻击与防御技术概述在云计算环境中,虚拟机(VM)之间的安全隔离是保障多租户数据安全的核心机制。然而,RowHammer攻击的出现对这一基础安全假设提出了严峻挑战。RowHammer是一种利用DRAM物理特性的硬件漏洞攻击方式,攻击者通过…...

LLM推理解耦技术:提升大型语言模型推理效率的关键方法

1. LLM推理解耦技术概述在大型语言模型(LLM)推理服务领域,推理解耦(Inference Disaggregation)正成为突破传统性能瓶颈的关键技术路径。这项技术的核心思想是将原本耦合的推理流程拆分为具有不同计算特征的独立阶段&am…...

Keil uVision开发环境文件类型全解析

1. uVision支持的文件类型全解析作为一名嵌入式开发工程师,我使用Keil uVision IDE已有八年时间。今天想系统梳理一下这个开发环境支持的各种文件类型,特别是那些在实际项目中经常遇到但官方文档解释不够详细的格式。理解这些文件类型对于项目管理和问题…...

BFloat16与SME2指令集在AI加速中的应用

1. BFloat16浮点格式解析BFloat16(Brain Floating Point 16)是专为机器学习设计的16位浮点格式,它在保持与32位单精度浮点(FP32)相同指数位宽(8位)的同时,将尾数位从23位缩减到7位。…...

基于机器学习的癫痫发作检测与预测:从EEG信号处理到LSTM时序建模

1. 项目概述:从被动监测到主动预警的癫痫管理革新作为一名长期关注医疗健康与人工智能交叉领域的技术从业者,我始终对如何将前沿算法转化为切实的临床价值抱有浓厚兴趣。癫痫,作为一种影响全球数千万人的慢性神经系统疾病,其核心痛…...

告别瞎猜!用DBSCAN和K-means搞定毫米波雷达点云聚类,附完整Matlab代码与数据集

毫米波雷达点云聚类实战:DBSCAN与K-means算法深度对比与Matlab实现在自动驾驶和智能感知领域,毫米波雷达因其全天候工作能力和稳定的性能表现,成为环境感知系统中不可或缺的传感器。然而,原始雷达点云数据往往呈现出稀疏、噪声多且…...

神经网络在高能物理探测器定时中的应用:从CFD到ANN的精度突破

1. 项目概述:当探测器遇上神经网络在高能物理实验的前沿,时间就是一切。无论是精确测量粒子的飞行时间以确定其动量,还是重建粒子碰撞的顶点,皮秒(ps,10^-12秒)量级的定时精度往往是决定实验成败…...

26年5月系分论文~写作思路深度拆解

Hello 我是方才,15人研发leader、5年团队管理&架构经验。文末,附26年10月最新软考备考资料备考交流群,群友可享受每月直播哟!2605系分论文分析今天系分和架构均已考完,方才先预祝所有考生均能逢考必过!…...

状态机设计模式优雅的进行通信解包~

正文大家好,我是bug菌~在早年玩单片机的时候,最开始接触到的通信协议基本上都是串口通信协议了吧,那时候拿到一个通信需求无非想着怎么设计一个不错的通信协议,然后写出来一套惊艳的解析算法,在实践过程中你肯定遇到过…...