2

我在应用程序启动时在 Qt GUI 线程中做了大量活动(创建/预分配和隐藏超过一千个小部件,主要作为运行时/初始化权衡,它是一个嵌入式系统,需要在运行期间保持响应)。

响应式操作的目标已经实现 - 但现在我面临着使初始化更具响应性的挑战。将初始化线程化到工作线程不是一种选择——大部分 CPU 负载来自对 QtGui 的调用,而这些负载需要在主线程中进行。

所以,我想知道是否有一个选项可以让应用程序控制来处理所有其他事件?做重绘等?

4

2 回答 2

4

更简洁,无需在代码中添加processEvents()调用:将创建/预分配实现为插槽。让它成为一个带有封装状态机的插槽(知道接下来要做什么),或者做更多的插槽,或者委托给一些具有通用接口的类,取决于你的设计和品味。每次完成对插槽的调用后,再次将调用作为排队连接发布给自己。

slots: void makeWidget();
signals: void widgetMade();
...
connect(this,SIGNAL(widgetMade()),this,SLOT(makeWidget()),Qt::QueuedConnection);

这样,您的小部件创建将与其他 GUI 活动一样排队。显式的第 5 个参数限定符是必需的,默认值Qt::AutoConnection将被解析为,Qt::DirectConnection因为您在同一个线程中。作为奖励,你实际上可以做一个非阻塞的初始化进度条,因为你知道要初始化多少个小部件。

于 2012-09-09T20:40:30.680 回答
0

似乎我的 GoogleFu 已经抛弃了我一段时间:

qApp->processEvents()

这会处理所有未完成的 GUI 事件——只要经常调用它就可以解决问题。

于 2012-09-09T20:29:42.103 回答