当CPU负载达到100%时,如何使UI保持响应(主要使用C++和Qt)?

10

我在多线程应用程序中面临一个问题,需要让UI和整个操作系统保持响应。

我正在开发一款基于C++和Qt的应用程序,该应用程序同时从多个流接收和转换大量视频帧。

每个流都在其自己的独立工作线程(使用DirectX)中检索、转换和渲染。这意味着我没有使用默认的GUI线程来渲染帧。

在一台性能强劲的计算机上,我没有问题,因为CPU可以处理所有数据并及时为GUI线程处理用户请求。但在一台老旧的计算机上,它不起作用,CPU被用于100%来处理我的数据,UI会出现滞后,可能需要10秒钟才能处理按钮单击。

我想让我的UI响应快速。事实上,我只希望我的工作线程在没有其他任务要做的情况下工作。我尝试将工作线程优先级更改为低,但它不起作用。我还尝试在工作线程中使用sleep(10),但由于可能有很多线程,它们不会同时进入睡眠状态,所以也行不通。

无论使用哪种工具包,最好的方法是什么,以保持在这种情况下UI的响应性?


1
听起来你只是创建了太多的线程。 - David Schwartz
7
你应该将处理用户界面请求的线程设定为比工作线程更高的优先级。 - Ivor Prebeg
1
我尝试将工作线程的优先级降低,但是没有起作用。显然,这是您问题所要求的建议(Ivor已经提供了),因此请展示您的代码并描述出了什么问题。另外,对于实时视频显示,通常需要添加一些代码来测量时间,如果您无法同时渲染帧,则开始减少并发渲染-丢弃一些帧;或者采取一些措施来降低分辨率或渲染质量。 - Tony Delroy
1
你的内存不够用了吗?那种响应时间更像是内存在磁盘上进行分页,除非你有真正疯狂数量的工作线程。 - Mike Seymour
1
如果降低工作线程的优先级不能解决问题,并且您没有启动比CPU核心更多的线程,则用户正在与内核线程竞争。通常是视频驱动程序。而且用户总是会失败的。 - Hans Passant
显示剩余4条评论
1个回答

4

我不能在上面的列表中添加评论,所以我要在这里补充我的几分意见:

  • 如果您希望操作系统响应更快,请确保不要消耗太多RAM并在较低优先级下启动进程-据我所知,只有在操作系统必须决定应该运行哪个进程的线程时才会考虑线程优先级,但是当考虑到来自系统的其他进程时,整个进程仍然以100%的CPU工作
  • 确保不要运行太多线程,好的解决方案是创建与核心数量相同使用100% CPU的线程,如果您需要更多,则使用多任务技术

检查一件事情-您如何显示视频?您是否确保您的显示速率(从流中获取的数据)与显示卡的刷新率匹配?当您有要显示的数据时,您是否通知主线程更新屏幕(更好的解决方案),还是强制每个线程显示帧(不好的解决方案)?


大多数操作系统锁定是因为同时显示太多数据或读/写太多数据。 - Piotr Tkaczyk
2
好的,谢谢大家,我感觉很蠢,但是我找到问题了!实际上,这只是我的应用程序中的一个错误。我使用进程资源管理器来跟踪我的线程优先级,并发现它没有正确设置!但是设置优先级就是解决方案! - SaiyanRiku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接