Ich versuche, QtConcurrent :: run zu verwenden, um eine Funktion innerhalb meiner MainWindow-Klasse auszuführen damit die UI während der Berechnungen weiterhin reagiert. Hier ist, wie ich es umgesetzt:QtConcurrent :: run with MainWindow-Funktion, Warnmeldung "QObject :: setParent: Übergeordnetes Element nicht festlegen, neues übergeordnetes Element ist in einem anderen Thread"
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();
}
Es funktioniert gut, und die Benutzeroberfläche reagiert und der Fortschrittsbalken wird korrekt aktualisiert, jedoch in der Ausgabe erhalte ich die Fehlermeldung „QObject :: setParent: Kann nicht eingestellt Eltern, neue Mutter ist in einem anderen Thread "oft, von etwas, das in einer Schleife ausgeführt wird.
Irgendwelche Ideen, was das verursacht, oder Vorschläge für eine bessere Implementierung von QtConcurrent :: run?
Dank
Das Problem besteht darin, dass Sie die Benutzeroberfläche von Threads außer dem Hauptthread aktualisieren. Siehe [Dokumentation] (http://doc.qt.io/qt-5/threads-technologies.html#example-use-cases), Führen Sie die Funktion mit QtConcurrent :: run() aus, * Schreiben Sie an einen Thread- Sichere Variable zum Aktualisieren des Fortschritts *. – Mike
https://forum.qt.io/topic/44153/access-to-component-of-ui-from-the-function-of-qtconcurrent-run-foo/2 – Marco
perfect thanks guys –