0

每次调用 ObjParser::loadData() 时,我都会尝试启动一个新线程,就像他们在例中所做的那样。

所以我写了这段代码。

#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 

我不知道是什么导致了这个问题,请你给我一个提示如何解决这个问题。

4

2 回答 2

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
});
于 2013-09-03T15:29:15.320 回答
0

C++ 11 线程的工作方式与 Boost 的线程非常相似。他们期望一个不带参数的函数或函数对象,因此如果您的函数是您使用的类的成员函数,您需要将函数指针绑定到对象的实例和所需的任何参数。看看 std::bind std::mem_fn 等等......

于 2013-09-03T15:31:16.950 回答