繁体   English   中英

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

[英]How to run several QDialogs simultaneously in different threads?

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

还有更简单的解决方案吗? 先感谢您。

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

如果您要制作的动画太复杂而无法在GUI线程中渲染,并且坚持使用旧版小部件,则必须通过QtConcurrent::runQPainter渲染到QImage ,作为异步工作。 然后,异步工作器会将图像发送到对话框,然后对话框将其显示在屏幕上。

有关两个相关示例的链接,请参见此答案

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

当然,多处理方法也是可行的。 随意启动带有参数的同一个可执行文件,该参数指定用于进程间通信的管道的随机名称,并修改行为(第一个对话框与第二个对话框等)。 有关如何轻松启动自己的信息,请参见此答案

没有发布任何代码很难提供帮助。

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

每个线程都必须给其他线程一个执行指令的机会(调用QThread::yieldCurrentThreadQThread::sleep )。 否则,如果一个线程处于一个巨大的循环中做某事,则永远不会给其他线程一个做某事的机会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM