Очистить результаты QFuture для повторного использования в классе / объекте
У меня есть приложение, которое использует несколько QFutures для интенсивной обработки. Поскольку эти функции можно повторять, я создаю класс, который позволяет мне постоянно повторно использовать их.
Вот простой пример того, что я использую. Обратите внимание, это представление того, что я намереваюсь сделать, это не мой настоящий код.
Краткий обзор:
2 Фьючерсы, один за другим - в этих фьючерсах используются функции-члены, зависящие от экземпляра, например, фильтрация. Естественно, существует больше фьючерсов с разными типами шаблонов, это просто пример. Я начну с звонка, например startProcessing()
с некоторым вводом и ожидайте, что результат будет напечатан (в данном случае или передан через сигнал).
заголовок
//...
QFuture<SomeType> futureFilterAction;
QFuture<SomeType> futureMapAction;
QFutureWatcher<SomeType> futureWatcherFilterAction;
QFutureWatcher<SomeType> futureWatcherMapAction;
//...
impl класс
// filter member function
bool ClassName::filterAction(const SomeType& someType) {
// some internal filtering rules
return true;
}
// mapping member function
SomeType ClassName::mapAction(const SomeType& someType) {
// some internal mapping function(s)
SomeType t = ...
return t;
}
//...
void ClassName::startProcessing(QList<SomeType> someInputList) {
// Perform action when finished
connect(&futureWatcherFilterAction, &QFutureWatcher<SomeType>::finished, [this], [this]() {
// perform finishing actions & e.g. start map future with some result input
startMapFuture(someResultInputToMap)
});
// Perform action when result is ready
connect(&futureWatcherFilterAction, &QFutureWatcher<SomeType>::resultReadyAt, [this], [this](int indexOfResult) {
// do something with futureFilterAction.resultAt(indexOfResult)
// perform some action e.g. add to some list with a mutex lock & unlock
});
// use std::bind for member function
futureFilterAction = QtConcurrent::filter(someInputList, std::bind(&ClassName::filterAction, this, std::placeholders::_1));
futureWatcherFilterAction.setFuture(futureFilterAction);
}
void ClassName::startMapFuture(QList<SomeType> someInputList) {
// Perform action when finished
connect(&futureWatcherMapAction, &QFutureWatcher<SomeType>::finished, [this], [this]() {
// perform finishing actions & e.g. start map future with some result input
printResults(someResultInputToMap)
});
// Perform action when result is ready
connect(&futureWatcherMapAction, &QFutureWatcher<SomeType>::resultReadyAt, [this], [this](int indexOfResult) {
// do something with futureMapAction.resultAt(indexOfResult)
// perform some action e.g. add to some list with a mutex lock & unlock
});
// use std::bind for member function
futureMapAction = QtConcurrent::mapped(someInputList, std::bind(&ClassName::mapAction, this, std::placeholders::_1));
futureWatcherMapAction.setFuture(futureMapAction);
}
//...
Этот код может вызываться несколько раз в течение жизненного цикла приложения. Если я запускаю это один раз, он выполняет действия на 100% правильно, т.е. все ожидаемые результаты возвращаются и сохраняются при получении результата от вызова функции QFuture::resultAt(int).
Проблема
При вызове QFuture во второй раз и при запросе результата из этого уже запущенного future-объекта он возвращает результаты, хранящиеся внутри, в дополнение к новым результатам.
например, если я запустил следующее:
classNameInstance.startProcessing(someInputList)
он будет печатать
Line 1
Line 2
Line 3
Тогда, если я позвоню classNameInstance.startProcessing(aCompletelyNewInputList)
, он напечатает
Line 1 < ---- stored internally in QFuture (are returned & printed first)
Line 2 < ----
Line 3 < ----
Text 1 < ---- New results which I expect start here
Text 3 < ----
Text 5 < ----
Text 7 < ----
Вопрос:
Это подводит меня к моему вопросу, как я могу очистить результаты QFuture? Что предлагается использовать для QFuture в этом сценарии?