如何在不同的线程中同时 运行 多个 QDialogs?
How to run several QDialogs simultaneously in different threads?
我正在使用 Qt Creator 开发 Qt 5.5。
我有一个名为 settingsWindow 的大 class,顾名思义,它负责各种设置。这些设置然后用于启动一些 QDialogs,这些 QDialogs 在 qGraphicsView 内的场景上显示非常复杂的动画,通过 QCoreApplication::processEvents() 不断更新,进而保持 GUI 响应。动画是通过 QDialog 的 start() 方法启动的。
我想同时 运行 这些 QDialogs,例如通过一个按钮启动,同时启动所有这些 QDialogs。我尝试使用包装器,即从 QObject 继承的简单 class,每次都将其分配给不同的线程,但是如果我启动 QDialog 一切正常,当我启动第二个时,第一个"blocks"(动画停止,仅在第二个 Qdialog 中动画可见)。
我唯一的解决方案是为它们中的每一个启动一个单独的 QProcess(这样我确定它们 运行 分别并且在不同的线程上),但我需要重写逻辑(每个 QDialog 的单独程序).
有没有更简单的解决方案?提前谢谢你。
没有发布任何代码,很难提供帮助。
您可以尝试为每个对话创建一个线程,然后将一个对话移动到每个线程(使用 QObject::moveToThread
)。
每个线程都必须时不时地给其他线程执行指令的机会(调用 QThread::yieldCurrentThread
或 QThread::sleep
)。否则,如果一个线程在一个巨大的循环中做某事,它永远不会给其他线程做某事的机会。
无法在单个进程中完成。任何触及 QWidget
的东西只能在主线程中 运行 。您的代码恰好 运行 完全是巧合,您依赖于未定义的行为,而 Qt 从来没有打算以这种方式使用。没有对此进行测试,依此类推:您只能靠自己,并且必须深入研究 Qt 代码以找出要更改的内容以允许其中任何一项。
如果您正在制作过于复杂而无法在 GUI 线程中呈现的动画,并且您坚持使用旧版小部件,则必须使用 QPainter
将它们呈现为 QImage
,作为通过 QtConcurrent::run
的异步工作。然后,异步工作人员将向对话框发送图像信号,然后对话框将它们 blit 到屏幕。
有关两个相关示例的链接,请参阅 this answer。
否则,使用QML。对于大多数事情,从 CPU 的角度来看,QML 动画几乎是空操作。 GPU 完成了所有的渲染工作,而且表现令人钦佩。
多处理方式当然也是可行的。随意启动相同的可执行文件,参数指定用于进程间通信的管道的随机名称,并修改行为(第一个与第二个对话框等)。请参阅 了解如何轻松启动自己。
我正在使用 Qt Creator 开发 Qt 5.5。 我有一个名为 settingsWindow 的大 class,顾名思义,它负责各种设置。这些设置然后用于启动一些 QDialogs,这些 QDialogs 在 qGraphicsView 内的场景上显示非常复杂的动画,通过 QCoreApplication::processEvents() 不断更新,进而保持 GUI 响应。动画是通过 QDialog 的 start() 方法启动的。 我想同时 运行 这些 QDialogs,例如通过一个按钮启动,同时启动所有这些 QDialogs。我尝试使用包装器,即从 QObject 继承的简单 class,每次都将其分配给不同的线程,但是如果我启动 QDialog 一切正常,当我启动第二个时,第一个"blocks"(动画停止,仅在第二个 Qdialog 中动画可见)。 我唯一的解决方案是为它们中的每一个启动一个单独的 QProcess(这样我确定它们 运行 分别并且在不同的线程上),但我需要重写逻辑(每个 QDialog 的单独程序).
有没有更简单的解决方案?提前谢谢你。
没有发布任何代码,很难提供帮助。
您可以尝试为每个对话创建一个线程,然后将一个对话移动到每个线程(使用 QObject::moveToThread
)。
每个线程都必须时不时地给其他线程执行指令的机会(调用 QThread::yieldCurrentThread
或 QThread::sleep
)。否则,如果一个线程在一个巨大的循环中做某事,它永远不会给其他线程做某事的机会。
无法在单个进程中完成。任何触及 QWidget
的东西只能在主线程中 运行 。您的代码恰好 运行 完全是巧合,您依赖于未定义的行为,而 Qt 从来没有打算以这种方式使用。没有对此进行测试,依此类推:您只能靠自己,并且必须深入研究 Qt 代码以找出要更改的内容以允许其中任何一项。
如果您正在制作过于复杂而无法在 GUI 线程中呈现的动画,并且您坚持使用旧版小部件,则必须使用 QPainter
将它们呈现为 QImage
,作为通过 QtConcurrent::run
的异步工作。然后,异步工作人员将向对话框发送图像信号,然后对话框将它们 blit 到屏幕。
有关两个相关示例的链接,请参阅 this answer。
否则,使用QML。对于大多数事情,从 CPU 的角度来看,QML 动画几乎是空操作。 GPU 完成了所有的渲染工作,而且表现令人钦佩。
多处理方式当然也是可行的。随意启动相同的可执行文件,参数指定用于进程间通信的管道的随机名称,并修改行为(第一个与第二个对话框等)。请参阅