C++ QT并发错误:引用非静态成员
我正在Mac上运行Qt5.1和QtQuick 2.0,操作系统为OS-X 10.8.4 我的Qt QML GUI变得无响应,因为我正在用文件I/O操作阻塞事件循环。通常的解决方法是使用Will Bickford讨论的多线程 为此,我尝试使用: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
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);