Состояние гонки с QThread / QDialog - PullRequest
2 голосов
/ 27 января 2011

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

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

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

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

Когда поток завершает работу до того, как QDialog :: exec () настроил диалог, вызов "accept ()"это было вызвано сигналом, будет потеряно, и диалог не закроется сам ...

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

Ответы [ 2 ]

3 голосов
/ 27 января 2011

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

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

0 голосов
/ 27 января 2011

Прошло некоторое время с тех пор, как я использовал Qt.Но почему вы используете QThread для обработки нажатия кнопки «Принять» из диалогового окна?Вы можете использовать QDialog :: result (), если это модальное диалоговое окно, или вы можете переслать сигнал из потока в QDialog :: accept () ...

...