带有QThread/Qdialog的种族条件
-
25-10-2019 - |
题
我正在尝试在以下情况下避免种族条件:
QDialog* dialog = [...];
QThread* thread = [...];
connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));
thread->start();
dialog->exec();
当线程在QDialog :: exec()设置对话框之前完成时,信号触发的“ ACCEPT()”调用将丢失,对话框不会关闭自己...
因此,理想情况下,我只想在对话框准备好处理后才启动线程,但是我该怎么做?
解决方案
诀窍是,仅在显示对话框时才必须启动线程。因此,一旦提出了Qdialog的展示,就必须启动它。
首先,您必须捕获显示器,可以通过使用 QObject::installEventFilter
和 QObject::eventFilter
或通过子分类 QDialog
覆盖 QWidget::showEvent
.
完成此操作后,您要发出线程的信号。您需要一个自定义信号,您会发出 YourClass::eventFilter
或IN YourClass::showEvent
取决于您选择捕获演出活动的方式。
现在只需将该信号连接到 QThread::start()
插槽,您应该完成(编辑:使用 Qt::QueuedConnection
).
确保您不处理 QDialog::accepted()
信号两次!
其他提示
自从我使用QT以来已经有一段时间了。但是,为什么您要使用qthread来处理对话框中的接受点击呢?如果是模态对话框,则可以使用qdialog :: result(),也可以将信号从线程转发到qdialog :: Accesped()...
不隶属于 StackOverflow