当 CPU 负载为 100%(主要使用 C++ 和 Qt)时,如何保持 UI 响应?
Posted
技术标签:
【中文标题】当 CPU 负载为 100%(主要使用 C++ 和 Qt)时,如何保持 UI 响应?【英文标题】:How to keep UI responsive when CPU load is 100% (Mainly using C++ and Qt)? 【发布时间】:2012-07-17 09:58:47 【问题描述】:我在需要在多线程应用程序中保持 UI(和完整操作系统)响应之间存在问题。
我正在开发一个应用程序(基于 c++ 和 Qt),它同时接收和转换来自多个流的大量视频帧。
每个流都在其独立的工作线程中检索、转换和渲染(使用 DirectX)。这意味着我没有使用默认的 GUI 线程来渲染框架。
在功能强大的计算机上我没有问题,因为 cpu 可以处理所有数据并为 GUI 线程处理用户请求留出时间。但在旧电脑上,它不起作用,CPU 100% 用于处理我的数据,并且 UI 滞后,可能需要 10 秒才能处理按钮点击。
我想让我的 UI 保持响应。事实上,我希望我的工作线程只有在没有其他操作可做的情况下才能工作。我试图将工作线程优先级更改为低,但它不起作用。我还在工作线程中尝试了 sleep(10),但是因为我可以有很多线程,它们不会同时进入睡眠状态,所以它也不起作用。
在这种情况下保持 UI 响应的最佳方法是什么(无论工具包使用什么)?
【问题讨论】:
听起来你只是创建了太多线程。 您应该使工作线程的优先级低于处理 UI 请求的线程 "我尝试将工作线程优先级更改为低,但它不起作用。" - 显然这就是你的问题会征求的建议(Ivor 已经提供了),所以显示你的代码并描述哪里出了问题。另外,对于实时视频显示,添加一些代码行来测量时间是正常的,如果您渲染帧的速度不够快,请开始减少并发渲染 - 丢弃一些帧;或者做一些事情来降低分辨率或渲染质量。 内存不足了吗?这种响应时间感觉更像是内存在磁盘之间进行分页,除非您的工作线程数量非常惊人。 如果降低工作线程的优先级并不能解决问题,并且您启动的工作线程数量没有超过 cpu 内核数量,则用户正在与内核线程竞争。通常是视频驱动程序。而且永远会输。 【参考方案1】:无法在上面的列表中添加我的 cmets,所以我必须在这里添加我的几美分:
如果您希望操作系统响应更快,那么请确保您不会消耗太多 RAM 并以较低优先级启动进程 - 只有当操作系统必须决定应该运行进程中的哪个线程时才会考虑 afaik 线程优先级,但是整个考虑到系统中的其他进程时,进程仍可在 100% 的 CPU 上运行 确保不要运行太多线程,好的解决方案是创建尽可能多的使用 100% cpu 的线程,如果您想要更多,请使用多任务技术要检查的一件事-您如何进行视频显示?您是否确保您的显示速率(来自流的数据)与显示卡的刷新率相匹配?当您有数据要显示时,您是通知主线程需要更新屏幕(更好的解决方案)还是强制每个线程显示框架(错误的解决方案)?
【讨论】:
大部分操作系统锁定是因为同时显示的数据过多或读取/写入的数据过多 好的,谢谢大家,我觉得自己很笨,但我发现了问题!实际上,这只是我的应用程序中的一个错误。我使用进程资源管理器来跟踪我的线程优先级,我发现它没有正确设置!但是设置优先级是解决方案!以上是关于当 CPU 负载为 100%(主要使用 C++ 和 Qt)时,如何保持 UI 响应?的主要内容,如果未能解决你的问题,请参考以下文章