Установить список 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());
}
}