QThread退出崩溃中的QProgressBar更新
我有下面的代码可以正常工作。它会更新每个for循环中的进度条值。我唯一的问题是,当我完成并在OnProcessUserRowsStarted方法中调用emit ProcessUserRowsFinished()时,程序崩溃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
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?是的,您可以删除作用域指针或删除这两个连接。我终于测试了,它成功了。谢谢您提供的信息