Programming/Qt

[Qt] QtConcurrent mappedReduced 사용하기

_SYPark 2024. 11. 8. 13:08
728x90

예전 포스팅에서 소개했던 QtConcurrent를 사용하면 간단하고 Qt Event에 특화된 비동기 처리가 가능합니다. 이 QtConcorruent에서 제공하는 map-reduce 패턴을 사용할 수 있습니다.

 

map-reduce 패턴을 간단히 설명하자면 수행할 작업을 분산하여 처리하고 하나로 모은다고 생각하시면 됩니다.

QtConcurrent::mappedReuced 함수 원형입니다.

template <typename Sequence, typename MapFunction, typename ReduceFunction>
QFuture<typename QtPrivate::MapResultType<MapFunction, Sequence>::ResultType>
mappedReduced(const Sequence &sequence, MapFunction mapFunction, ReduceFunction reduceFunction, QtConcurrent::ReduceOptions options = QtConcurrent::SequentialReduce);

 

전달되는 파라미터에 대한 설명입니다.

  • sequence : 처리할 데이터 셋(QList, QVector)
  • mapFunction : 데이터가 처리될 함수 전달
  • reduceFunction : 각각 분산되어 처리된 데이터를 하나로 모으는 함수 전달

반환 값은 QFuture 데이터가 반환되며 비동기 상태를 관리하는 객체입니다. waitForResult 함수로 처리가 끝날때까지 대기가 가능하며 result 함수로 처리 결과를 받을 수 있습니다.

 

아래 코드는 QtConcurrent::mappedReduced를 사용하는 간단한 예제입니다. 

먼저 .pro에 concurrent 모듈을 추가합니다.

QT = core concurrent

전달되는 Function을 람다로 처리하였습니다.

#include <QtConcurrent>
#include <QFuture>
#include <QList>
#include <iostream>


int main() {
    QList<int> data;
    for ( int i=0; i<= 100; i++ ) {
        data.append(i);
    }

    auto mapFunction = [&] ( int value ) -> int {
        qDebug() << "Map : " << "value = " << value;
        return value * 2;
    };

    auto reduceFunction = [&] ( int &result, int value ) {
        result += value;
        qDebug() << "Reduce : " << "Origin Value = " << value / 2 << "Value = " << value << " Result = " << result;
    };

    // mappedReduced 호출
    QFuture<int> future = QtConcurrent::mappedReduced(data, mapFunction, reduceFunction, QtConcurrent::SequentialReduce);

    // 작업 완료 대기 및 결과 출력
    future.waitForFinished();
    int result = future.result();
    std::cout << "Result: " << result << std::endl; // 출력 예시: 30

    return 0;
}
// 실행 결과
Map :  value =  0
Map :  value =  1
Map :  value =  2
Map :  value =  3
Map :  value =  4
Map :  value =  5
Map :  value =  7
Map :  value =  6
Map :  value =  8
Map :  value =  10
Map :  value =  9
/* 중략 */
Reduce :  Origin Value =  91 Value =  182  Result =  8372
Reduce :  Origin Value =  92 Value =  184  Result =  8556
Reduce :  Origin Value =  93 Value =  186  Result =  8742
Reduce :  Origin Value =  94 Value =  188  Result =  8930
Reduce :  Origin Value =  95 Value =  190  Result =  9120
Reduce :  Origin Value =  96 Value =  192  Result =  9312
Reduce :  Origin Value =  97 Value =  194  Result =  9506
Reduce :  Origin Value =  98 Value =  196  Result =  9702
Reduce :  Origin Value =  99 Value =  198  Result =  9900
Reduce :  Origin Value =  100 Value =  200  Result =  10100
Result: 10100

 

728x90