多线程 UI 的最佳方式

Best way to multithread UI?

本文关键字:方式 最佳 UI 多线程      更新时间:2023-10-16

正如文档中明确指出的,Qt GUI只能从主线程访问。 对于具有多个大型繁忙表的复杂应用程序,这可能是Qt喜欢做的所有字体大小文本指标计算的瓶颈。 我能想到的唯一选择是使用单独的流程进行多任务处理。 这些表目前的速度与您所能获得的一样快,自定义模型直接映射到缓存,该缓存使用 dataChanged() 调用最保守的更改单元格集从另一个线程馈送。 我已经使用 vTune 进行了分析,现在 70% 的应用程序时间都在 Qt 渲染代码中。 有什么建议吗?

我没有

使用过QT,但是仅从一个线程(GUI线程)访问GUI在我熟悉的几乎所有GUI中都是已知问题。在这种情况下,我使用了 2 种解决方案,其中我更喜欢第一种:

1) 您的表单将以计时器间隔更新 GUI(在本例中为表)。计时器在 GUI 线程的事件上激活。在这些计时器事件中,您从全局变量中读取数据并更新表。全局变量可以根据需要由任意数量的线程更新。您可能需要同步(例如信号量)对全局变量的访问。

2) 在许多 GUI API 中,线程可以通过向 GUI 线程传递一个函数(或对象)来更新 GUI,并要求它在其上下文中尽快执行它。同时,调用线程阻塞,直到 GUI 完成操作。我记得有三个这样的函数 - InvokeInvokeLater来自Java和C#,或者wxPython的wx.CallAfter

使用 MVC 模式的变体并使模型成为多线程

如果你的表条目和方法分几个步骤完成,你可以调用QCoreApplication::p rocessEvents()来更新两次计算之间的qt UI。您可以做的另一件事是在不同的线程上运行所有内容,并在计算完成后从线程发出信号。最后,更新是从主线程在 ui 上完成的,但异步完成。要连接到来自不同线程的信号,您必须使用 qRegisterMetaType<>