C++ QT并发错误:引用非静态成员

C++ QT并发错误:引用非静态成员,c++,qt,non-static,qtconcurrent,C++,Qt,Non Static,Qtconcurrent,我正在Mac上运行Qt5.1和QtQuick 2.0,操作系统为OS-X 10.8.4 我的Qt QML GUI变得无响应,因为我正在用文件I/O操作阻塞事件循环。通常的解决方法是使用Will Bickford讨论的多线程 为此,我尝试使用: QtConcurrent::blockingMapped() 这可能比使用显式QFuture对象更简单。我一直在阅读和,并获得了以下代码(以此为模型): 这不是很现实,但可以作为一个简单的草图来说明我在下面遇到的问题 当我试图将QtConcurrent

我正在Mac上运行Qt5.1和QtQuick 2.0,操作系统为OS-X 10.8.4

我的Qt QML GUI变得无响应,因为我正在用文件I/O操作阻塞事件循环。通常的解决方法是使用Will Bickford讨论的多线程

为此,我尝试使用:

QtConcurrent::blockingMapped() 
这可能比使用显式QFuture对象更简单。我一直在阅读和,并获得了以下代码(以此为模型):

这不是很现实,但可以作为一个简单的草图来说明我在下面遇到的问题

当我试图将QtConcurrent::blockingMapped()封装到另一个“datamodel.h”类中时,就会出现问题:


与:

[this](const QString& file){load(file);}
给出代码:

QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, 
                                       [this](const QString& file){load(file);});
我在这件事上真的犯了个错误,可能是个简单的错误,但我很难把它弄清楚


有人能帮忙吗?

显然,您不使用具有lambda表达式的C++11。因此,使用STL或Boost中的绑定或创建函数对象

QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, 
                                   std::bind1st(std::mem_fun(&DataModel::load), this));
QList allTheDataObjects=QtConcurrent::blockingMapped(所有文件,
std::bind1st(std::mem_-fun(&DataModel::load),this);
确定以上解决方案不能与参考(知道错误)一起工作。定义函子(或使用Boost::bind):

class LoadDataModel/*:公共标准::一元函数*/{
公众:
LoadDataModel(DataModel*p):d(p){}
DataObject运算符()(常量QString&s)常量{
返回d->加载;
}
私人:
数据模型*d;
}
QList allTheDataObjects=QtConcurrent::blockingMapped(所有文件,LoadDataModel(this));
好的,开始工作了

在这种情况下,对于那些不想弄乱绑定或编写自己的“functor”的人来说,这可能会有好处(下面的方法更简单):

首先,在datamodel.h文件中为“load”函数使用静态类型:

static DataObject load(const QString& fileList);

这是因为C++类的静态函数可以调用,而不需要实例化对象。

然后,在datamodel.cpp文件中,它是这样简单的:

DataModel::load 
给予:

QList<DataObject> allTheDataObjects = 
                      QtConcurrent::blockingMapped(allFiles, DataModel::load);
QList所有数据对象=
QtConcurrent::blockingMapped(所有文件,数据模型::加载);

然后,代码按预期运行。

您的建议起作用了吗?在添加了#include之后,我尝试了上面的代码,但现在得到了一系列其他非描述性错误,例如stl_函数。h:411:error:operator()的多个重载。。。等等,对于许多行。还有其他想法吗?感谢所有建议!我忘了引用有问题:,所以在本例中,解决问题的最快方法是定义函子。我将努力定义函子,但我们是否确定函子是问题所在?请注意,“load”已经是一元函数,因此没有其他需要绑定的参数。还要注意的是,在将QtConcurrent::blockingMapped()打包到DataModel类中之前,此代码运行良好(如上所示),因此从本质上讲,如果functor绑定是问题所在,为什么没有DataModel类它不会中断?无负载不是一元函数。要调用它,您总是需要两个参数:
this
写在函数名之前,而
fileList
写在函数名之后。如果没有对象,您无法调用此函数。谢谢,这是有道理的,但它在没有DataModel类的情况下运行良好,这似乎仍然很奇怪。
datamodel.cpp: error: reference to non-static member function must be called:
QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, this->load);
this->load
[this](const QString& file){load(file);}
QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, 
                                       [this](const QString& file){load(file);});
datamodel.cpp: error: expected expression:
QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, 
                                   std::bind1st(std::mem_fun(&DataModel::load), this));
class LoadDataModel /*: public std::unary_function<QString, DataObject>*/ {
public:
    LoadDataModel(DataModel *p) : d(p) {}

    DataObject operator()(const QString &s) const {
        return d->load(s);
    }
private:
    DataModel *d;
}

QList<DataObject> allTheDataObjects = QtConcurrent::blockingMapped(allFiles, LoadDataModel(this));
static DataObject load(const QString& fileList);
DataModel::load 
QList<DataObject> allTheDataObjects = 
                      QtConcurrent::blockingMapped(allFiles, DataModel::load);