Обновление QProgressBar в QThread завершается сбоем

У меня есть следующий код, который работает так, как ожидалось. Он обновляет значение индикатора выполнения в каждом цикле for. Единственная проблема, с которой я столкнулся, это то, что когда я закончу и вызову emit ProcessUserRowsFinished() в методе OnProcessUserRowsStarted, программа вылетает.

class UsersProcess: public QObject
{
    Q_OBJECT

public:
    UsersProcess(CTCore::DBConnect* db_context, UserSettingsMap user_settings_map);
    void SetProgressBar(QProgressBar *progress_bar);

private:

    QProgressBar *progressBar;
    QSharedPointer<QList<CTCoreZen::User>> listUsers;
    QScopedPointer<QThread> threadRowWorker;

signals:
    void ProcessUserRowsFinished();
    void ProgressBarSetValue(int value);

}   

void UsersProcess::SetProgressBar(QProgressBar *progress_bar)
{
    this->progressBar = progress_bar;
}

void UsersProcess::OnUserListSuccess(QList<CTCoreZen::User> *users)
{
    this->listUsers.reset(users);

    this->progressBar->setVisible(true);
    this->progressBar->setTextVisible(true);
    this->progressBar->setMinimum(0);
    this->progressBar->setMaximum(this->listUsers->size());
    this->progressBar->setValue(0);



    this->threadRowWorker.reset(new QThread());
    this->moveToThread(this->threadRowWorker.data());

    connect(this->threadRowWorker.data(), &QThread::started, this, &UsersProcess::OnProcessUserRowsStarted);

    connect(this, &UsersProcess::ProgressBarSetValue, this->progressBar, &QProgressBar::setValue);

    connect(this, &UsersProcess::ProcessUserRowsFinished, this->threadRowWorker.data(), &QThread::quit);
    connect(this, &UsersProcess::ProcessUserRowsFinished, this, &UsersProcess::deleteLater);
    connect(this->threadRowWorker.data(), &QThread::finished, this->threadRowWorker.data(), &QThread::deleteLater);

    this->threadRowWorker->start();
}   

void UsersProcess::OnProcessUserRowsStarted()
{
    int row = 0;

    UsersData userData(this->dbContext);

    int maxRows = this->listUsers->size();
    for(auto iter = this->listUsers->begin(); iter != this->listUsers->end(); ++iter)
    {
         row++;
         emit this->ProgressBarSetValue(row);
    }

    emit ProcessUserRowsFinished();
}

person adviner    schedule 29.12.2015    source источник


Ответы (1)


Это из-за того, что ваша тема была удалена. Этот вызов удаляет экземпляр класса UsersProcess, а QScopedPointer удаляет поток.

connect(this, &UsersProcess::ProcessUserRowsFinished, this, &UsersProcess::deleteLater);

Но у вас также есть эти связи

connect(this, &UsersProcess::ProcessUserRowsFinished, this->threadRowWorker.data(), &QThread::quit);
connect(this->threadRowWorker.data(), &QThread::finished, this->threadRowWorker.data(), &QThread::deleteLater);

Когда одно из этих событий срабатывает, поток уже удаляется.

person Evgeny    schedule 29.12.2015
comment
Я следую примеру по этой ссылке: mayaposch.wordpress.com/2011/11/01/ Значит, это сделано неправильно? Как лучше всего это сделать? Или это потому, что я использую QSharedPointer? - person adviner; 29.12.2015
comment
Да, вы можете просто удалить указатель области действия или удалить эти два соединения. - person Evgeny; 29.12.2015
comment
Наконец-то я проверил, и это сработало, спасибо за информацию - person adviner; 02.01.2016