QThread / QDialog的竞争条件

时间:2011-01-27 13:33:37

标签: qt qthread qeventloop

我正试图在以下情况中避免竞争条件:

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

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

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

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

理想情况下,我想在对话框准备好处理之后启动线程,但是我该怎么办?

2 个答案:

答案 0 :(得分:3)

诀窍是,只有在显示对话框时才必须启动线程。因此,一旦引发QDialog的showEvent,你就必须启动它 首先,您必须捕获showEvent,您可以使用QObject::installEventFilterQObject::eventFilter或通过子类化QDialog覆盖QWidget::showEvent来实现此目的。 完成后,您需要通知线程启动。您需要在YourClass::eventFilterYourClass::showEvent中发出的自定义信号,具体取决于您选择捕获节目事件的方式。
现在只需将该信号连接到QThread::start()插槽即可完成(编辑:使用Qt::QueuedConnection)。

确保你没有两次处理QDialog::accepted()信号!

答案 1 :(得分:0)

我使用Qt已经有一段时间了。但是为什么你使用QThread来处理对话框中的Accept点击?你可以使用QDialog :: result(),如果它是一个模态对话框,或者你可以将信号从线程转发到QDialog :: accepted()......