正如文档中明确指出的,Qt GUI 只能从主线程访问。对于具有多个大而繁忙的表的复杂应用程序,这可能是 Qt 喜欢做的所有字体大小文本度量计算的瓶颈。我能想到的唯一选择是使用单独的进程进行多任务处理。这些表目前与您获得的速度一样快,自定义模型直接映射到缓存,该缓存使用最保守的更改单元集上的 dataChanged() 调用从另一个线程提供。我已经使用 vTune 进行了分析,现在 70% 的应用时间都在 Qt 渲染代码中。有什么建议么?
问问题
1025 次
3 回答
5
我没有使用过 QT,但是在我熟悉的几乎所有 GUI 中,仅从一个线程(GUI 线程)访问 GUI 是一个已知问题。在这种情况下,我使用了 2 种解决方案,其中我更喜欢第一种:
1)您的表单将按时间间隔更新 GUI(在本例中为表格)。计时器在 GUI 线程的事件上被激活。在这些计时器事件中,您从全局变量中读取数据并更新您的表。全局变量可以由任意数量的线程更新。您可能需要同步(例如信号量)对全局变量的访问。
2) 在许多 GUI API 中,线程可以通过将函数(或对象)交给 GUI 线程并要求它在其上下文中尽快执行来更新 GUI。调用线程同时阻塞,直到 GUI 完成操作。我可以回忆起三个这样的函数——Invoke
来自InvokeLater
Java 和 C#,或者wx.CallAfter
来自 wxPython。
于 2012-12-05T06:01:52.737 回答
3
使用 MVC 模式的变体并使模型多线程
于 2012-12-05T20:50:29.087 回答
2
如果您的表格条目和方法分几个步骤完成,您可以调用 QCoreApplication::processEvents()在计算之间更新 qt ui。您可以做的另一件事是在不同的线程上运行所有内容,并在计算完成时从线程发出信号。最后,更新是从主线程在 ui 上完成的,但是是异步的。要连接到来自不同线程的信号,您必须使用qRegisterMetaType<>。
于 2012-12-05T07:33:11.613 回答