Ожидание возврата значения из потока n раз

Рейтинг: 0Ответов: 0Опубликовано: 02.03.2023

Всем доброго времени суток. В процессе ковыряния многопоточности в 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.

Ответы

Ответов пока нет.