Как я могу сделать свой блок QThread и ждать, пока функция, вызванная из основного потока, вернет значение? - PullRequest
2 голосов
/ 26 сентября 2011

Я делаю некоторую работу в переопределении QThread.Время от времени я хотел бы задать пользователю вопрос Да / Нет, поэтому я планировал использовать QMessageBox :: question ().Проблема в том, что я не могу назвать это из ветки.Это не большой, я могу послать сигнал, который подключается к слоту в главном потоке GUI, который будет отображать окно сообщения, но мне также нужно, чтобы пользовательский поток блокировал и ждал, пока окно сообщения будет отклонено и получит возвратзначение (здесь QMessageBox :: StandardButton).Как мне обойти это?

РЕДАКТИРОВАТЬ: Сработает ли следующий (псевдо-) код?

class MyThread
{
public:
    MyThread(QObject *parent)
    {
        connect(this, SIGNAL(inputRequired()), parent, SLOT(popMsgBox()), Qt::QueuedConnection);
    }

void MyThread::run()
{
    QMutex m;
    for (...)
    {
        if (something) 
        {
            m.lock();
            emit inputRequired();
            w.wait(&m);
            m.unlock();
        }

        if (MyGui->ans_ == Yes) do_something();
    }
}

signals:
    void inputRequired();

protected:
    QWaitCondition w;

};

void MyGui::popMsgBox()
{
    ans_ = QMessageBox::question(this, "Question", "Yes or no?", Yes | No);
    MyThread->w->wakeAll();
}

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Если вы все равно работаете с сигналами и слотами, вы также можете использовать тип соединения Qt :: BlockingQueuedConnection . Это соединение будет ожидать завершения слота (в другом потоке). Будьте осторожны, чтобы не зайти в тупик.

2 голосов
/ 26 сентября 2011

Простой ответ - используйте условие.

http://doc.qt.io/qt-5/qwaitcondition.html

...