Я пытаюсь использовать QtConcurrent :: run для выполнения функции в моем классе MainWindow, так что пользовательский интерфейс остается гибким во время вычислений. Вот как я реализовал его:QtConcurrent :: run с функцией MainWindow, предупреждающее сообщение «QObject :: setParent: невозможно установить родительский, новый родитель в другом потоке»
void MainWindow::on_calculate_pb_clicked()
{
QFuture<void> future = QtConcurrent::run(this,&MainWindow::calculation);
}
void MainWindow::calculation()
{
progressBar->show();
loadMap();
integral.clear();
positions.clear();
offset.clear();
lines = 0;
for(int i=0;i<paths.size();i++)
{
if(i ==0)
{
lines = countNumberOfLines(paths.at(i));
}
double file = i+1;
ui->statusBar->showMessage(QString("Processing file %1 of %2").arg(file).arg(paths.size()));
calculateIntegral(paths.at(i));
offset.push_back(ui->tableWidget->item(i,1)->text().toDouble());
}
makePositionVector();
plotData(ui->customPlot);
ui->export_pb->setEnabled(true);
progressBar->hide();
ui->statusBar->showMessage("Done",3000);
}
void MainWindow::calculateIntegral(QString path)
{
QVector<double> mappeddata,tempdata;
mappeddata.resize(map.size());
tempdata.resize(numberofdetectors);
double currentLine = 0;
QFile File(path);
if(File.exists()==true){
File.open(QIODevice::ReadOnly);
QTextStream in(&File);
double val;
while(!in.atEnd())
{
for(int j = 0;j<numberofdetectors;j++)
{
in >> val;
tempdata[j]+=val;
currentLine++;
double progress = currentLine/lines*100;
progressBar->setValue(progress);
}
}
for(int i =0;i<map.size();i++)
{
mappeddata[i] = tempdata.at(map.at(i));
}
for(int k = 0;k<numberofdetectors; k++)
{
integral.push_back(mappeddata.at(k));
}
}
File.close();
}
Он отлично работает и пользовательский интерфейс отзывчивый и прогресс бар обновляется правильно, однако на выходе я получаю сообщение об ошибке «QObject :: SetParent: Невозможно установить родитель, новые родительские находится в другом потоке "много раз, из чего-то, что выполняется в цикле.
Любые идеи, что вызывает это, или предложения по лучшей реализации QtConcurrent :: run?
Благодаря
проблема в том, что вы обновляете пользовательский интерфейс из потоков, отличных от основного потока. См. [Документация] (http://doc.qt.io/qt-5/threads-technologies.html#example-use-cases). Запустите эту функцию, используя QtConcurrent :: run(), * Write to thread- безопасная переменная для обновления прогресса *. – Mike
https://forum.qt.io/topic/44153/access-to-components-of-ui-from-the-function-of-qtconcurrent-run-foo/2 – Marco
безупречное спасибо, ребята –