udp数据报接收逻辑---代码分析
该函数运行在子线程中。void UdpFuc::slot_start() { char pBuf[1500]; int ret 0; memset((char *)pBuf, \0, 1500); int sockAddrSize sizeof (struct sockaddr_in); while(1) { ret recvfrom(m_recvSocket, (char*)pBuf, sizeof(pBuf), 0, (struct sockaddr *)m_recvSockAddr, (socklen_t*)sockAddrSize); // 处理代码 if(ret0) { QByteArray bdp((const char*)pBuf, ret); emit sign_bdp(bdp); } } }每包emit的性能问题看这段代码if(ret 0) { QByteArray bdp((const char*)pBuf, ret); emit sign_bdp(bdp); }每收到一个 UDP 包就 emit 一次。在低频场景比如每秒几十个包完全没问题但在高频场景下会引发一系列问题。逐个拆开。为什么一、先搞清楚emit跨线程发生了什么假设UdpFuc对象在工作线程里运行slot_start在工作线程sign_bdp连接的槽在主线程GUI 线程则emit触发的是Qt::QueuedConnection跨线程自动用队列连接工作线程 主线程 │ │ recvfrom 收到包 │ │ │ QByteArray 拷贝 │ │ │ emit sign_bdp(bdp) │ │ │ 构造一个 QMetaCallEvent ──投递──► 事件队列 │ │ 继续 recvfrom │ │ │ 事件循环取出 │ │ 调用槽函数 │ │ 处理 bdp关键点emit不是直接调用槽函数而是投递一个事件到目标线程的事件队列然后立即返回。二、高频下的问题问题 1事件队列堆积 → 内存暴涨假设包速率10 万包/秒每个包 1400 字节每秒投递 10 万个QMetaCallEvent每个事件携带一个 QByteArray拷贝了 1400 字节如果主线程处理速度跟不上GUI 线程还要渲染、响应点击队列长度10000 → 50000 → 200000 → ... 内存占用10000 × 1400 ≈ 14 MB 100000 × 1400 ≈ 140 MB 1000000 × 1400 ≈ 1.4 GB ← 内存爆炸后果内存持续增长主线程越来越卡每次要从队列取事件最终 OOM 或界面假死OOM是Out Of Memory的缩写中文意思是内存耗尽 / 内存溢出。问题 2QByteArray的深拷贝开销QByteArray bdp((const char*)pBuf, ret);这一行做了malloc分配ret字节堆内存memcpy从pBuf拷贝ret字节构造QByteArray对象引用计数、隐式共享结构10 万包/秒 × 1400 字节 每秒 140 MB 的内存分配 拷贝。加上emit投递时QByteArray还会再拷贝一次到事件里虽然QByteArray是隐式共享的但跨线程投递时通常会触发 detach。detach是 Qt 里和「隐式共享COW」配套的一个动作中文常译作分离或脱离共享。纯粹的 CPU 和内存带宽浪费。根本原因包速率 处理速率这是一个生产者-消费者速率不匹配问题生产者recvfrom10 万包/秒 消费者主线程槽1 万包/秒中间靠无界队列缓冲结果就是队列无限增长。正确做法要么降低投递频率要么用有界队列 丢弃策略。方案 批量合并最常用累积 N 个包或等 M 毫秒一次性 emitvoid UdpFuc::slot_start() { char pBuf[2048]; QByteArray batch; // 累积缓冲 QElapsedTimer timer; timer.start(); const int FLUSH_INTERVAL_MS 20; // 20ms 刷一次50 次/秒 const int FLUSH_SIZE 64 * 1024; // 或累积到 64KB while (!isInterruptionRequested()) { struct sockaddr_in cliAddr; socklen_t addrLen sizeof(cliAddr); ssize_t ret recvfrom(m_recvSocket, pBuf, sizeof(pBuf), 0, (struct sockaddr*)cliAddr, addrLen); if (ret 0) { // 追加到批量缓冲前面加长度前缀方便切分 quint32 len static_castquint32(ret); batch.append(reinterpret_castconst char*(len), sizeof(len)); batch.append(pBuf, ret); } else if (ret 0) { if (errno EAGAIN || errno EWOULDBLOCK || errno EINTR) ; // 超时继续检查是否该 flush else break; } // 达到条件就 flush if (batch.size() FLUSH_SIZE || (timer.elapsed() FLUSH_INTERVAL_MS !batch.isEmpty())) { emit sign_batch(batch); batch.clear(); timer.restart(); } } // 退出前 flush 剩余 if (!batch.isEmpty()) emit sign_batch(batch); }效果从 10 万次/秒 emit →50 次/秒事件队列不再堆积主线程一次处理一批效率高代价引入最多 20ms 延迟对大多数应用可接受。判断标准如果emit频率 × 主线程单次处理时间 1 秒就会堆积。10 万次/秒 × 主线程每次 20 微秒 2 秒/秒 ← 超过 100%必然堆积如何检测是否出问题打印队列长度qDebug() 事件队列长度: QCoreApplication::hasPendingEvents(); // 或更精确地测量问题本质每包 emit 每包一次跨线程事件投递 QByteArray 拷贝。当包速率超过主线程处理速率时事件队列无限增长导致内存暴涨、界面卡死、最终丢包。一句话emit不是免费的——它是跨线程事件投递。高频下必须批量否则事件队列会成为内存黑洞。

相关新闻

ant-design-blazor 数字输入框小数精度完全指南:Step 如何决定 value 精度

ant-design-blazor 数字输入框小数精度完全指南:Step 如何决定 value 精度

UI组件前端 【免费下载链接】ant-design-blazor 🌈A rich set of enterprise-class UI components based on Ant Design and Blazor. 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-blazor 点击查看 免费下载 在 ant-design-blazor 的 Input…

2026/10/11 22:36:25 阅读更多 →
智能体技能(Agent Skills)工程化实践:可测试、可组合、可替换的行为模块设计

智能体技能(Agent Skills)工程化实践:可测试、可组合、可替换的行为模块设计

1. 项目概述:这不是一个“技能库”,而是一套可装配的智能体行为模块“agent-skills”这个名称乍看像某个开源仓库的命名,但实际拆解下来,它指向的是一种正在快速落地的工程范式——把大模型驱动的智能体(Agent&#xf…

2026/10/11 22:36:25 阅读更多 →
PyCharm神经网络二分类实战:从工程搭建到调参避坑

PyCharm神经网络二分类实战:从工程搭建到调参避坑

简介:这份资源面向正在学习神经网络与机器学习入门、希望用 PyCharm 完成二分类实战的开发者,围绕猫与非猫图像识别这一经典场景,提供了一套可直接运行的 Python 项目源码。压缩包共 6 个文件,包含 2 个 py 源码文件、2 个 h5 模型…

2026/10/11 22:35:24 阅读更多 →

最新新闻

PS5硬件扩展边界全解析:接口、协议与物理限制

PS5硬件扩展边界全解析:接口、协议与物理限制

项目标题“AnyPS5”目前在公开网络中无权威技术文档、官方产品发布或主流科技媒体报导支撑,亦未见于索尼互动娱乐(Sony Interactive Entertainment)任何已知产品线、开发代号或公开技术白皮书。经多平台语义检索与行业术语交叉验证&#xff0…

2026/10/11 23:15:10 阅读更多 →
YOLOv8+PaddleOCR车牌识别全链路工程实践

YOLOv8+PaddleOCR车牌识别全链路工程实践

简介:本资源是一套面向本科毕业设计与人工智能课程实践的智能车牌识别系统完整实现方案,聚焦图像识别与机器学习在智能交通场景中的落地应用。系统基于YOLOv8目标检测与PaddleOCR文字识别双引擎协同架构,覆盖车牌定位、字符分割、OCR识别全流…

2026/10/11 23:15:08 阅读更多 →
无电压传感器三相PWM整流器虚拟磁链定向仿真全解析

无电压传感器三相PWM整流器虚拟磁链定向仿真全解析

1. 这个项目到底在做什么说句实在话,三相PWM整流器的Simulink仿真,我在学生时代和工程实践里都反反复复碰过很多次。电压型PWM整流器这一块,最常见的控制策略是电压定向矢量控制(VOC),也就是把三相交流量通…

2026/10/11 23:15:06 阅读更多 →
RWKV7-G1 0.1B 推理模型发布:把纯血 RNN 塞进嵌入式设备的 TaoToken 实测路径

RWKV7-G1 0.1B 推理模型发布:把纯血 RNN 塞进嵌入式设备的 TaoToken 实测路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 23:15:04 阅读更多 →
RAP消息被截断排查:从50字符到220字符的嵌入式通信避坑指南

RAP消息被截断排查:从50字符到220字符的嵌入式通信避坑指南

上周我接到一个很典型的排查任务:现场反馈物联网关上报到平台的消息“丢尾”,一条本该有 80 个字符的 RAP 消息,对端只收到了 50 个字符。第一反应是 TCP 拆包没处理好,查了一圈才意识到,根本不是网络问题,…

2026/10/11 23:14:59 阅读更多 →
车载空调系统建模全流程:从热力学方程到量产图纸

车载空调系统建模全流程:从热力学方程到量产图纸

车载空调这东西,看着是个普普通通的汽车零部件,真要较真起来能让人头大一圈。热力学、流体力学、控制理论、结构设计全搅在一起,你光会仿真或者光会画图都不够,得从算法推导一路干到图纸落地才算是真本事。我这些年折腾车载空调建…

2026/10/11 23:13:59 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →