Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QThread退出崩溃中的QProgressBar更新_Qt_Qthread_Qprogressbar - Fatal编程技术网

QThread退出崩溃中的QProgressBar更新

QThread退出崩溃中的QProgressBar更新,qt,qthread,qprogressbar,Qt,Qthread,Qprogressbar,我有下面的代码可以正常工作。它会更新每个for循环中的进度条值。我唯一的问题是,当我完成并在OnProcessUserRowsStarted方法中调用emit ProcessUserRowsFinished()时,程序崩溃 class UsersProcess: public QObject { Q_OBJECT public: UsersProcess(CTCore::DBConnect* db_context, UserSettingsMap user_settings_m

我有下面的代码可以正常工作。它会更新每个for循环中的进度条值。我唯一的问题是,当我完成并在OnProcessUserRowsStarted方法中调用emit ProcessUserRowsFinished()时,程序崩溃

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();
}
类用户进程:公共QObject
{
Q_对象
公众:
用户进程(CTCore::DBConnect*db_上下文,用户设置映射用户设置映射);
无效设置进度条(QProgressBar*进度条);
私人:
QProgressBar*progressBar;
QSharedPointer列表用户;
QScopedPointer螺纹加工工;
信号:
void ProcessUserRowsFinished();
无效ProgressBarSetValue(int值);
}   
void UsersProcess::SetProgressBar(QProgressBar*进度条)
{
此->进度条=进度条;
}
void UsersProcess::OnUserListSuccess(QList*用户)
{
此->listUsers.reset(用户);
此->进度条->设置可见(真);
此->进度条->设置可见(true);
此->进度条->设置最小值(0);
此->进度条->设置最大值(此->列表用户->大小());
此->进度条->设置值(0);
此->threadRowWorker.reset(新的QThread());
this->moveToThread(this->threadRowWorker.data());
连接(this->threadRowWorker.data(),&QThread::started,this,&UsersProcess::OnProcessUserRowsStarted);
连接(this,&UsersProcess::ProgressBarSetValue,this->progressBar,&QProgressBar::setValue);
连接(this,&UsersProcess::ProcessUserRowsFinished,this->threadRowWorker.data(),&QThread::quit);
连接(此,&UsersProcess::ProcessUserRowsFinished,此,&UsersProcess::deleteLater);
连接(this->threadRowWorker.data(),&QThread::finished,this->threadRowWorker.data(),&QThread::deleteLater);
此->threadRowWorker->开始();
}   
void UsersProcess::OnProcessUserRowsStarted()
{
int行=0;
usersdatauserdata(此->数据库上下文);
int maxRows=this->listUsers->size();
对于(自动iter=this->listUsers->begin();iter!=this->listUsers->end();++iter)
{
行++;
发出此->ProgressBarSetValue(行);
}
发出ProcessUserRowsFinished();
}

这是因为您的线程已被删除。 此调用删除类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);

当其中一个事件触发时,该线程已被删除。

我遵循此链接中的示例:那么这是否做得不正确?最好的方法是什么?或者是因为我使用的是QSharedPointer?是的,您可以删除作用域指针或删除这两个连接。我终于测试了,它成功了。谢谢您提供的信息