Очистить результаты QFuture для повторного использования в классе / объекте - PullRequest
0 голосов
/ 19 июня 2020

У меня есть приложение, которое использует несколько QFutures для интенсивной обработки. Поскольку эти функции можно повторять, я создаю класс, который позволяет мне постоянно повторно использовать их.

Вот простой пример того, что я использую. Обратите внимание, это представление того, что я намереваюсь, это не мой настоящий код.

Краткий обзор:

2 Futures, один запускается за другим - эти фьючерсы используют функции-члены, зависящие от экземпляра, например, для фильтрации. Естественно, существует больше фьючерсов с разными типами шаблонов, это просто пример. Я начну с вызова, например, startProcessing() с некоторым вводом, и жду результата, который будет напечатан (в данном случае или передан через a сигнал).

заголовок

//...
QFuture<SomeType> futureFilterAction;
QFuture<SomeType> futureMapAction;
QFutureWatcher<SomeType> futureWatcherFilterAction;
QFutureWatcher<SomeType> futureWatcherMapAction;
//...

impl class

// 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 s в этом сценарии?

...