我试图在每次调用ObjParser :: loadData()时尝试启动一个新线程,就像他们在this示例中所做的那样。
所以我写了这段代码。
#include <thread>
void ObjParser::loadData()
{
thread loadingThread(_loadData);
loadingThread.detach();
}
void ObjParser::_loadData()
{
//some code
}
但是当我尝试编译它时,我收到了这个错误:
error C3867: 'ObjParser::_loadData': function call missing argument list; use '&ObjParser::_loadData' to create a pointer to member
所以我创建了一个指向成员函数的指针:
#include <thread>
void ObjParser::loadData()
{
thread loadingThread(&ObjParser::_loadData);
loadingThread.detach();
}
void ObjParser::_loadData()
{
//some code
}
然后编译器抱怨:
error C2064: term does not evaluate to a function taking 0 arguments
我不知道导致问题的原因,请你给我一个如何解决这个问题的提示。
答案 0 :(得分:5)
_loadData
似乎是一个非静态成员,所以你需要在一个对象上调用它 - 可能是调用了loadData
的同一个对象:
thread loadingThread(&ObjParser::_loadData, this);
或使用lambda
thread loadingThread([this]{_loadData();});
或者,我可能会删除额外的函数,只使用lambda:
thread loadingThread([this]{ // or [] if you don't need to access class members
// some code
});
答案 1 :(得分:0)
C ++ 11线程与Boost的线程非常相似。他们期望函数或函数对象不带参数,因此如果你的函数是你正在使用的类的成员函数,你需要将函数指针绑定到对象的实例和所需的任何参数。看看std :: bind std :: mem_fn等......