在课堂中使用QTConcurrent :: mappedReduce

Using QtConcurrent::MappedReduce in a class

本文关键字:QTConcurrent mappedReduce 课堂      更新时间:2023-10-16

我当前正在学习用于多线程应用程序的QtConncurrenct。因此,出于测试目的,我决定实现一个简单的程序,该程序总结列表中的整数,这是代码:

#include <QCoreApplication>
#include <QtConcurrent>
#include <functional>
class intObj{
    int m_value;
public:
    intObj(int val = 0):m_value(val){}
    int val() const {return m_value;}
};
static intObj mapFunction(const intObj &num){
    return intObj(num.val());
}
static void reduceFunction(intObj &sum, const intObj &term){
    int x = sum.val();
    int y = term.val();
    sum = intObj(x+y);
}

class myTest{
    public:
    int getSum(QList<intObj> numbers);
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<intObj> n;
    for(int i = 0; i < 1000 ; i++){
        n.append(intObj(i));
    }
    myTest m;
    int sum = m.getSum(n);
    return a.exec();
}

int myTest::getSum(QList<intObj> numbers){
    auto sum = QtConcurrent::mappedReduced(numbers,mapFunction,reduceFunction);
    return sum.result().val();
}

此程序现在运行正确,但地图和减少功能不在同类内容之外。如何修改此程序以使映射和减少功能在类IntoBJ中?

我真的很感谢一个工作的例子。提前致谢。

您不能将指针传递给mappedReduced这样的方法。

  • 如果您不需要mapfunction内部的对象和简化功能,则应使两个函数static
static int mappedFunction(const int num){
    return num;
}
static void reduce(int &sum, const int term){
    sum += term;
}
  • 如果您需要使用该对象,则可以使用std::bind(请参见使用绑定函数参数):
auto sum = QtConcurrent::mappedReduced(numbers,
    std::bind(&myTest::mappedFunction, this, std::placeholders::_1),
    std::bind(&myTest::reduce, this, std::placeholders::_1, std::placeholders::_2));
// Or lambda if Qt support them:
auto sum = QtConcurrent::mappedReduced(numbers, 
    [this] (int num) { mappedFunction(num); },
    [this] (int &sum, int num) { reduce(sum, num); });

您也可以使用功能对象并存储对当前myTest实例的引用。

在使用成员函数时进行了更多的挖掘和重读QTConcurrency之后我意识到有2个主要点

  1. 容器和成员功能的类应相同
  2. 为了避免传递此参数的头部疼痛,使成员函数静态

这是最终的工作版本

#include <QCoreApplication>
#include <QtConcurrent>
#include <functional>
class intObj{
    int m_value;
public:
    intObj(int val = 0):m_value(val){}
    int val() const {return m_value;}
    static intObj mapFunction(const intObj &num){
        return intObj(num.val());
    }
    static void reduceFunction(intObj &sum, const intObj &term){
        int x = sum.val();
        int y = term.val();
        sum = intObj(x+y);
    }
};
class myTest{
    public:
    int getSum(QList<intObj> numbers);
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<intObj> n;
    for(int i = 0; i < 1000 ; i++){
        n.append(intObj(i));
    }
    myTest m;
    int sum = m.getSum(n);
    return a.exec();
}

int myTest::getSum(QList<intObj> numbers){
    auto sum = QtConcurrent::mappedReduced(numbers,&intObj::mapFunction,&intObj::reduceFunction);
    return sum.result().val();
}

最欢迎有关如何改进该计划的任何建议。