我正在尝试在以下情况下避免种族条件:

QDialog* dialog = [...];
QThread* thread = [...];

connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));

thread->start();
dialog->exec();

当线程在QDialog :: exec()设置对话框之前完成时,信号触发的“ ACCEPT()”调用将丢失,对话框不会关闭自己...

因此,理想情况下,我只想在对话框准备好处理后才启动线程,但是我该怎么做?

有帮助吗?

解决方案

诀窍是,仅在显示对话框时才必须启动线程。因此,一旦提出了Qdialog的展示,就必须启动它。
首先,您必须捕获显示器,可以通过使用 QObject::installEventFilterQObject::eventFilter 或通过子分类 QDialog 覆盖 QWidget::showEvent.
完成此操作后,您要发出线程的信号。您需要一个自定义信号,您会发出 YourClass::eventFilter 或IN YourClass::showEvent 取决于您选择捕获演出活动的方式。
现在只需将该信号连接到 QThread::start() 插槽,您应该完成(编辑:使用 Qt::QueuedConnection).

确保您不处理 QDialog::accepted() 信号两次!

其他提示

自从我使用QT以来已经有一段时间了。但是,为什么您要使用qthread来处理对话框中的接受点击呢?如果是模态对话框,则可以使用qdialog :: result(),也可以将信号从线程转发到qdialog :: Accesped()...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top