多线程 UI 的最佳方式
Best way to multithread UI?
正如文档中明确指出的,Qt GUI只能从主线程访问。 对于具有多个大型繁忙表的复杂应用程序,这可能是Qt喜欢做的所有字体大小文本指标计算的瓶颈。 我能想到的唯一选择是使用单独的流程进行多任务处理。 这些表目前的速度与您所能获得的一样快,自定义模型直接映射到缓存,该缓存使用 dataChanged() 调用最保守的更改单元格集从另一个线程馈送。 我已经使用 vTune 进行了分析,现在 70% 的应用程序时间都在 Qt 渲染代码中。 有什么建议吗?
使用过QT,但是仅从一个线程(GUI线程)访问GUI在我熟悉的几乎所有GUI中都是已知问题。在这种情况下,我使用了 2 种解决方案,其中我更喜欢第一种:
1) 您的表单将以计时器间隔更新 GUI(在本例中为表)。计时器在 GUI 线程的事件上激活。在这些计时器事件中,您从全局变量中读取数据并更新表。全局变量可以根据需要由任意数量的线程更新。您可能需要同步(例如信号量)对全局变量的访问。
2) 在许多 GUI API 中,线程可以通过向 GUI 线程传递一个函数(或对象)来更新 GUI,并要求它在其上下文中尽快执行它。同时,调用线程阻塞,直到 GUI 完成操作。我记得有三个这样的函数 - Invoke
,InvokeLater
来自Java和C#,或者wxPython的wx.CallAfter
。
使用 MVC 模式的变体并使模型成为多线程
如果你的表条目和方法分几个步骤完成,你可以调用QCoreApplication::p rocessEvents()来更新两次计算之间的qt UI。您可以做的另一件事是在不同的线程上运行所有内容,并在计算完成后从线程发出信号。最后,更新是从主线程在 ui 上完成的,但异步完成。要连接到来自不同线程的信号,您必须使用 qRegisterMetaType<>。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 在reactor中存储eventHandlers的最佳方式是什么
- 在AVX通道中混洗的最佳方式
- 从 T 创建 std::future 的最佳方式<T>
- C++:使用 std::unique_ptr 访问重载运算符++的最佳方式?
- 对列表列表中的元素进行分组的最佳方式
- 利用 GPU 的最佳方式
- 使用 QT C++过滤大数据的最佳方式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在C++中共享键值对的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 代表Quarto棋盘游戏棋子的最佳方式
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 创建控制台菜单C++的最佳方式
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?