我正试图在以下情况中避免竞争条件:
QDialog* dialog = [...];
QThread* thread = [...];
connect(thread, SIGNAL(finished()), dialog, SLOT(accept()));
thread->start();
dialog->exec();
当线程在QDialog :: exec()设置对话框之前完成时,由信号触发的“accept()”调用将丢失,对话框不会自行关闭...
理想情况下,我想在对话框准备好处理之后启动线程,但是我该怎么办?
答案 0 :(得分:3)
诀窍是,只有在显示对话框时才必须启动线程。因此,一旦引发QDialog的showEvent,你就必须启动它
首先,您必须捕获showEvent,您可以使用QObject::installEventFilter
和QObject::eventFilter
或通过子类化QDialog
覆盖QWidget::showEvent
来实现此目的。
完成后,您需要通知线程启动。您需要在YourClass::eventFilter
或YourClass::showEvent
中发出的自定义信号,具体取决于您选择捕获节目事件的方式。
现在只需将该信号连接到QThread::start()
插槽即可完成(编辑:使用Qt::QueuedConnection
)。
确保你没有两次处理QDialog::accepted()
信号!
答案 1 :(得分:0)
我使用Qt已经有一段时间了。但是为什么你使用QThread来处理对话框中的Accept点击?你可以使用QDialog :: result(),如果它是一个模态对话框,或者你可以将信号从线程转发到QDialog :: accepted()......