如何在不同的线程中同时运行多个QDialog?

时间:2015-11-06 19:25:05

标签: c++ multithreading qt qdialog

我正在使用Qt Creator开发Qt 5.5。 我有一个名为settingsWindow的大类,顾名思义,它会处理各种设置。这些设置然后用于启动一些QDialogs,这些QDialogs在qGraphicsView内的场景上显示非常复杂的动画,通过QCoreApplication :: processEvents()不断更新,而后者依次保持GUI响应。动画通过QDialog的start()方法启动。 我想同时运行这些QDialog,例如通过按钮启动,在同一时刻启动所有这些QDialog。我尝试使用一个包装器,即一个继承自QObject的简单类,每次都将它分配给一个不同的线程,但是如果我开始一个QDialog一切顺利,当我开始第二个时,第一个"块" (动画停止,只有在第二个Qdialog中动画才可见)。 我唯一的解决方案是为它们中的每一个启动一个单独的QProcess(这样我确定它们分别运行并且在不同的线程上),但我需要重写逻辑(每个QDialog的单独程序)。

任何更简单的解决方案?提前谢谢。

2 个答案:

答案 0 :(得分:1)

不能在一个过程中完成。触及QWidget的任何内容都只能在主线程中运行。您的代码恰好运行是巧合,您依赖于未定义的行为,Qt从未打算以这种方式使用。没有对此进行测试,依此类推:您自己也是如此,您必须深入研究Qt代码以找出允许更改的内容。

如果您正在制作过于复杂且无法在GUI线程中呈现的动画,并且您坚持使用旧版小部件,那么您必须使用QPainter将其呈现为{{ 1}},通过QImage进行异步工作。然后异步工作人员将图像发送到对话框,然后后者将它们显示到屏幕上。

有关两个相关示例的链接,请参阅this answer

否则,请使用QML。对于大多数事情,从CPU的角度来看,QML动画几乎都是无操作的。 GPU完成所有渲染,并且表现令人钦佩。

多处理方法当然也是可行的。随意启动相同的可执行文件,其参数指定用于进程间通信的管道的随机名称,以及修改行为(第1对第2对话框等)。有关如何轻松启动的信息,请参阅this answer

答案 1 :(得分:0)

没有张贴任何代码很难帮助。

您可以尝试为每个对话框创建一个线程,然后将一个对话框移动到每个线程(使用QObject::moveToThread)。

每个线程都必须给其他线程一些时间执行指令(调用QThread::yieldCurrentThreadQThread::sleep)。否则,如果一个线程在一个巨大的循环中做某事,它将永远不会让其他人有机会做某事。