gpt4 book ai didi

c++ - 如果没有显示 QProgressDialog,QtConcurrent::map 会崩溃

转载 作者:行者123 更新时间:2023-11-28 06:07:31 32 4
gpt4 key购买 nike

考虑这个 SLOT ,在我的主线程中,由一个按钮触发,该按钮采用 QTreeWidgetItem 的列表来自QTreeWidget .它使用 QtConcurrent::map()调用来执行一个长任务。 watcher连接到 QProgressDialog以显示进度。

void Main::on_actionButton_triggered() {
qRegisterMetaType<QVector<int> >("QVector<int>");

//Setting up a progress dialog
QProgressDialog progressDialog;

//Holds the list
QList<QTreeWidgetItem*> list;

//Setup watcher
QFutureWatcher<void> watcher;

//Setting up connections
//Progress dialog
connect(&watcher, SIGNAL(progressValueChanged(int)), &progressDialog, SLOT(setValue(int)));
connect(&watcher, SIGNAL(progressRangeChanged(int, int)), &progressDialog, SLOT(setRange(int,int)));
connect(&watcher, SIGNAL(progressValueChanged(int)), ui->progressBar, SLOT(setValue(int)));
connect(&watcher, SIGNAL(progressRangeChanged(int, int)), ui->progressBar, SLOT(setRange(int,int)));
connect(&watcher, SIGNAL(finished()), &progressDialog, SLOT(reset()));
connect(&progressDialog, SIGNAL(canceled()), &watcher, SLOT(cancel()));

connect(&watcher, SIGNAL(started()), this, SLOT(processStarted()));
connect(&watcher, SIGNAL(finished()), this, SLOT(processFinished()));

//Gets the list filled
for (int i = 0; i < ui->listTreeWidget->topLevelItemCount(); i++) {
list.append(ui->listTreeWidget->topLevelItem(i));
}

//And start
watcher.setFuture(QtConcurrent::map(list, processRoutine));

//Show the dialog
progressDialog.exec();

}

extern void processRoutine(QTreeWidgetItem* item) {
qDebug() << item->text(4);
}

我还在 UI(包含所有以前的小部件)中添加了一个 QProgressBar具有相同的信号/插槽。保持代码与之前的代码一样按预期工作:显示进度对话框,并且进度条完全按照对话框更新。相反,如果我评论

//progressDialog.exec(); 

或者我以某种方式隐藏了对话框,进程崩溃了(并非总是如此,有时会很顺利)。看着qDebug() << item->text(4);它崩溃并且输出显示随机混合文本(它们应该是文件名)。此外,进度条不会在 QProgressDialog 时自行更新。不显示,即使计算没有崩溃。

注意:之前在另一个函数遇到过类似的问题,通过设置解决了

QThreadPool::globalInstance()->setMaxThreadCount(1);

仅在 Windows 上,OSX 没问题。

那么,QProgressDialog 背后的技巧是什么?这让所有的事情都正确吗?有什么方法可以使用 QProgressBar而不是 QProgressDialog

注意

这是该过程顺利完成时的输出:

"C:/Users/Utente/Pictures/Originals/unsplash_52cee67a5c618_1.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1428278953961-a8bc45e05f72.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1429152937938-07b5f2828cdd.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1429277158984-614d155e0017.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1430598825529-927d770c194f.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1433838552652-f9a46b332c40.jpg"

最佳答案

当你评论 progressDialog.exec();您的 on_actionButton_triggered() 函数以销毁 progressDialog 结束,因此您的信号使用指向任何地方的指针。此外,watcher 也在执行所有映射之前或之后被销毁,而且它不会停止线程,因此它们也无处可去。

关于c++ - 如果没有显示 QProgressDialog,QtConcurrent::map 会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107296/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com