Вопрос

Я пытаюсь избежать состояния гонки в следующем сценарии:

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

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

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

Когда поток заканчивается до того, как QDialog :: exec () настройка диалога, вызов «Accept ()», который был вызван сигналом, будет потерян, и диалог не закроется ...

Так что в идеале я хочу запустить поток только после того, как диалог готов справиться с этим, но как бы я это сделал?

Это было полезно?

Решение

Хитрость в том, что вы должны запустить поток только тогда, когда диалог уже показан. Таким образом, вы должны начать его после того, как выставлен QDialog.
Сначала вы должны захватить ShowEvent, вы можете сделать это, используя QObject::installEventFilter а также QObject::eventFilter или путем подкласса QDialog Переходящий QWidget::showEvent.
Как только вы это сделаете, вы хотите сигнализировать поток, чтобы начать. Вам нужен собственный сигнал, который вы излучаете YourClass::eventFilter или в YourClass::showEvent в зависимости от того, как вы выбрали, чтобы захватить шоу -событие.
Теперь просто подключите этот сигнал к QThread::start() слот, и вы должны быть сделаны (редактировать: используйте Qt::QueuedConnection).

Убедитесь, что вы не справляетесь QDialog::accepted() сигнализируйте дважды!

Другие советы

Было некоторое время с тех пор, как я использовал QT. Но почему вы используете qthread, чтобы обрабатывать принять щелчок из диалога? Вы можете использовать qdialog :: result (), если это модальный диалог, или вы можете перенаправить сигнал из потока в qdialog :: accomted () ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top