Установить список QFutures для QFutureWatcher

Можно ли добавить несколько QFutureк QFutureWatcher? Я хотел добавить несколько функций QFutureWatcher и получить уведомление, когда все темы закончили.

QFutureSynchronizer не помог мне, так как у него нет сигнала, чтобы закончить

1 ответ

Я использую это так: где

QFutureSynchronizer<...> _synchronizer;
QFutureWatcher<...> _watcher;

-

void Service::request(const QString& word)
{
    QMutexLocker lock{&_mutex};

    auto future = QtConcurrent::run([this, word]()
                                    {
                                        //...
                                    });
    _synchronizer.addFuture(future);
    if (_watcher.isRunning() == false)
    {
        _watcher.setFuture(future);
    }
}

void Service::onReady()
{
    QMutexLocker lock{&_mutex};
    auto futures = _synchronizer.futures();
    _synchronizer.clearFutures();
    auto removeFrom = std::remove_if(futures.begin()
                                     , futures.end()
                                     , [](const QFuture<QPair<QString, QVector<QString>>>& element)
            {
                return element.isFinished();
            });

    for (auto it = futures.begin(); it != removeFrom; ++it)
    {
        _synchronizer.addFuture(*it);
    }
    for (auto it = removeFrom; it != futures.end(); ++it)
    {
        //...
    }

    auto waitingOnes = _synchronizer.futures();
    if (waitingOnes.isEmpty() == false && _watcher.isFinished())
    {
        _watcher.setFuture(waitingOnes.front());
    }
}
Другие вопросы по тегам