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

医院做网站怎么做wordpress还能用

医院做网站怎么做,wordpress还能用,总裁培训班,做网站导出用什么色彩模式📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》 🎥 更多学习视频请关注 B 站:嵌入式Jerry UI 程序退出卡顿问题分析:从真实案例深入理解退出清理路径负载问题 在 UI 程序开发中,我们经常遇到…

📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


UI 程序退出卡顿问题分析:从真实案例深入理解退出清理路径负载问题

在 UI 程序开发中,我们经常遇到一种现象:点击窗口关闭按钮(如右上角 “×”)后,界面不会立即消失,存在明显卡顿甚至几秒的延迟。本文将通过一个市场上真实的 C++ 多线程项目案例,从现象到分析,再到精确定位和优化,完整剖析 UI 程序退出时“清理路径”负载过重导致延迟的问题。


一、问题现象与背景

在这里插入图片描述

背景介绍

  • 平台:定制 Linux 系统 + ARM 开发板
  • UI框架:自主 C++ Qt 类似框架(非 FLTK)
  • 编程语言:C++
  • 场景:后台多个线程接收传感器数据并绘图,窗口关闭后界面卡顿 2 秒

问题描述

在点击 UI 主窗口的“×”按钮后,窗口没有立刻退出,而是卡顿 2 秒后程序才完全关闭。


二、初步定位手段:strace + perf

使用 strace 追踪关闭路径:

strace -tt -f -o close_ui.log ./realtime_monitor

分析长时间调用:

awk '{if($NF~/>/)print $0}' close_ui.log | sort -k1,1 | tail -n 50

发现大量 munmap(), futex(), poll(), close() 系统调用在退出阶段出现。

使用 perf 分析 CPU 栈:

perf record -g -p $(pidof realtime_monitor)
perf report

perf 报告显示 exit_mmap()do_exit()unmap_vmas() 占用较高。


三、真实项目定位:线程阻塞导致 UI 卡顿

程序逻辑简述:

int main() {std::thread net_reader(read_data_thread);std::thread plot_updater(update_ui_thread);return run_event_loop();
}void cleanup() {running = false;net_reader.join();plot_updater.join();printf("Cleanup done\n");
}

关键问题

关闭窗口后,主线程等待两个后台线程退出。但后台线程使用 epoll 和 futex 等阻塞式同步机制未能及时结束,导致 join() 卡顿,进而延迟 exit() 阶段。


四、函数路径与源代码分析

文件:src/data/read_data.cpp

void read_data_thread() {while (running) {epoll_wait(epfd, events, MAX_EVENTS, 1000); // 阻塞}
}

文件:src/ui/update_ui.cpp

void update_ui_thread() {while (running) {std::unique_lock<std::mutex> lock(ui_mutex);cond_var.wait(lock);  // 阻塞}
}

由于没有中断机制,线程在阻塞状态下不能响应 running = false,导致 join() 卡死直到超时或 epoll 返回。


五、优化方案

✅ 方案一:事件触发唤醒阻塞线程(推荐)

int eventfd = eventfd(0, 0);
// 添加到 epoll
epoll_ctl(epfd, EPOLL_CTL_ADD, eventfd, &ev);// 停止线程时:
uint64_t val = 1;
write(eventfd, &val, sizeof(val));

确保 epoll 立刻返回,线程可退出。

✅ 方案二:条件变量带超时

cond_var.wait_for(lock, std::chrono::milliseconds(100));

避免永久阻塞,提高退出响应速度。

✅ 方案三:主线程不等待所有子线程(不推荐)

net_reader.detach();

可能引发资源未释放问题,仅适合非关键线程。


六、业界类似案例

Chromium 多线程 UI 卡顿

Chromium 项目中 UI Thread、IO Thread、GPU Thread 协作复杂。关闭时如果未统一管理线程退出,会导致延迟或资源未清理。Google 使用 TaskRunner + Thread::StopSoon() 实现优雅退出。

ROS2 多线程节点退出卡顿

在 ROS2 中,节点使用多个线程订阅话题,如果未添加 rclcpp::shutdown() 中断 spin,退出会卡在 join()。后续版本优化中引入 signal-safe 的线程通知机制。


七、问题逻辑图总结

[点击 ×]↓
主线程 exit → join(worker)↓
worker 卡在 epoll/futex/poll↓
exit_mmap → 资源释放延迟 → 卡顿

八、结语与建议

UI 卡顿问题归根结底是“退出清理路径负载过重”或“线程阻塞未能及时响应”。建议:

  • 所有线程必须具备 可中断机制(事件/信号/超时)
  • 尽量避免在主线程 join() 阻塞
  • 使用 perf + strace 精准定位卡顿路径

避免将 UI 卡顿误判为图形性能问题,退出路径同样值得重视。



📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


http://www.dtcms.com/a/490354.html

相关文章:

  • YOLO系列目标检测算法全面解析
  • 目标检测全解析:从基础概念到深度学习实战技术
  • 基于深度学习计算机视觉的风格迁移技术原理与经典实现解析
  • Redis Key设计与Value存储
  • Pytest+requests进行接口自动化测试8.0(Allure进阶 + 文件上传接口 + 单接口多用例)
  • Kubernetes全景解读:从云原生基石到卓越实践
  • 【JUnit实战3_02】第二章:探索 JUnit 的核心功能(一)
  • 计算机视觉(opencv)——实时颜色检测
  • 宣传网站怎么做网站制作洋网络
  • 网站排名优化化快排优化网站服务器搭建的步骤
  • 本地用docling实现pdf转markdown操作笔记
  • iOS 26 APP 性能测试实战攻略:多工具组合辅助方案
  • 《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.21.5容器版集群》
  • wordpress 购物东莞网站优化方法有哪些
  • 接线盒工程量-图形识别高效运算
  • 后厨手套穿戴检测保障食品安全 手套佩戴检测 未戴手套检测 未佩戴手套实时报警 高危行业手套佩戴实时监控
  • 原位PL光谱测试教学(实操版)
  • 技术报告:高仿真虚构内容对主流大模型的现实感幻觉测试
  • 大模型提示词简介
  • R语言术语(2)
  • 广州网站建设推广谷歌官网首页
  • 【Python】基于Tkinter库实现文件夹拖拽与选择功能
  • Spring Boot 官方文档精解:构建与依赖管理
  • ONLYOFFICE 桌面编辑器9.1版本已发布:PDF密文功能和全新注释、工作表公式优化及文件恢复便捷化等
  • 重视网站阵地建设广州市天河区建设局官方网站
  • QPS、TPS、RPS 详解
  • 零基础从头教学Linux(Day 50)
  • 《计算机操作系统》_理解并发程序的执行_第4次课20250925
  • 结合多技术指标(如MACD、RSI)来验证布林带参数的可靠性
  • 设计师网站pintset广州市住房城乡建设部门户网站