多线程UI的最佳方式?

时间:2012-12-05 04:41:22

标签: c++ qt

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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