QThread 中的 QProgressBar 更新退出崩溃 [英] QProgressBar update in QThread quitting crashes

查看:80
本文介绍了QThread 中的 QProgressBar 更新退出崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码按预期工作.它更新每个 for 循环中的进度条值.我遇到的唯一问题是当我完成并在 OnProcessUserRowsStarted 方法中调用 emit ProcessUserRowsFinished() 时,程序崩溃了.

I have the following code that works as expected. It updates the progress bar value in each for loop. The only issue I have is when I'm done and call emit ProcessUserRowsFinished() in the method OnProcessUserRowsStarted the program crashes.

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();
}

推荐答案

这是因为您的帖子已被删除.此调用删除类 UsersProcess 的实例,而 QScopedPointer 删除线程.

This is because of your thread has been deleted. This call deletes the instance of class UsersProcess and QScopedPointer deletes the thread.

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);

当此事件之一触发时,线程已被删除.

When one of this events fires the thread is already deleted.

这篇关于QThread 中的 QProgressBar 更新退出崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆