예전 포스팅에서 소개했던 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
'Programming > Qt' 카테고리의 다른 글
[Qt] QTreeWiget Data Json 형태로 Save/Load 하는 방법 (0) | 2024.11.06 |
---|---|
[Qt] 다른 쓰레드에서 QTimer 처리하기 (1) | 2024.10.22 |
[Qt] QTableWidget header 정보는 남기고 내용만 지우기 (0) | 2024.07.18 |
[Qt] Qt + PCAN API를 이용한 CAN Chat 프로그램 (0) | 2024.07.18 |
[Qt] QString::toInt 주의사항 (0) | 2024.06.24 |