在课堂中使用QTConcurrent :: mappedReduce
Using QtConcurrent::MappedReduce in a class
我当前正在学习用于多线程应用程序的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个主要点
- 容器和成员功能的类应相同
- 为了避免传递此参数的头部疼痛,使成员函数静态
这是最终的工作版本
#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();
}
最欢迎有关如何改进该计划的任何建议。
相关文章:
- QtConcurrent::mapped not compiling
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- C++Qt QtConcurrent::filtered从std::shared_ptr的QVector减少
- 使用 QtConcurrent::run() 修改成员变量?
- 如何在QtConcurrent::run中启动QTimer或为什么QVector<QTimer*>不起作用
- 如何将字符串数组传递到 QtConcurrent::run 中?
- 让 QtConcurrent 中的 QTimer 正常工作
- C2064:术语未评估为1个参数qtConcurrent :: map的函数
- 在 c++11 模式下使用 QtConcurrent::run with move only 参数
- 使QTConcurrent ::映射与Lambdas一起工作
- 如何在跨平台C++中以毫秒为单位获得系统启动/启动时间(它应该在Windows / IOS / Android / MA
- 如何添加到由QtConcurrent::map操作的QStringList中?
- Qt - 如何将 QtConcurrent 和 QThreadPool 组合成 QProgressBar?
- QtConcurrent::run 是否可以与指向对象的智能指针一起使用
- QtConcurrent::blockingMap vs QtConcurrent::map and waitForFi
- 在课堂中使用QTConcurrent :: mappedReduce
- emplace(std::move(key), std::move(value)) vs emplace(std::ma
- 如何使用QTConcurrent ::运行过载函数
- std::bind, this and QtConcurrent
- 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用