Ожидание возврата значения из потока n раз
Всем доброго времени суток. В процессе ковыряния многопоточности в Qt пробую решить следующую задачу: нужно из потока главного окна запустить поток, в котором n раз будет произведена обработка данных и n раз вернётся значение в поток главного окна для вывода результатов. При этом поток главного окна не должен блокироваться (ну или ему переодически должно возвращаться управление). Не могу определиться с тем как лучше решить данную задачу. Попробовал использовать фьючерсы но столкнулся с подобной проблемой:
void MainWindow::on_run_triggered() {
QList<QString> test;
QVector<QString> current_services;
QFutureWatcher<QString> watcher;
// обновляем шаклу прогресса на ui
QObject::connect(&watcher, &QFutureWatcher<void>::progressRangeChanged, ui->progressBar, &QProgressBar::setRange);
QObject::connect(&watcher, &QFutureWatcher<void>::progressValueChanged, ui->progressBar, &QProgressBar::setValue);
foreach (serviceModel model, sequence->getModelList())
current_services.append(model.getData()); // в вектор добавляем n строк - данные для обработки
std::function<QString(const QString&)> process = [](const QString& model) -> QString {
QThread::sleep(1000); // имитация долгой обработки
return model + " test";
};
watcher.setFuture(QtConcurrent::map(current_services, process)); // не скомпилируется, ожидается тип void
for (int i = 0; i < current_services.count(); ++i)
test.append(watcher.resultAt(i)); // если сделать QFuture<void> не получится ждать результат QString
watcher.waitForFinished();
}
Посоветуйте пожалуйста правильный подход к реализации данного механизма. Использую Qt 5.15.2.
Источник: Stack Overflow на русском