我试图使用线程调用我的一些成员函数。假设我有这个
class myclass
{
public:
myclass();
double function1();
void function2();
};
myclass::myclass()
{}
double myclass::function1()
{
...
return a double;
}
void myclass::function2()
{
//use a thread to call function 1
std::thread t(function1);//doesnt work!-wont compile
std::thread t2(myclass::function1);//doesnt work either -wont compile
std::thread t3(&myclass::function1);//doesnt work here either - wont compile
}
如何通过C ++中另一个成员函数内的线程调用成员函数? 我顺便使用Visual Studio 2013 Preview。
更新2:
我按照我的说法做了,现在代码的某些部分编译得很好而其他一部分代码却没有! 这是生成错误的新示例代码:
class xGramManipulator
{
public:
xGramManipulator();
void ReadMonoGram();
void ReadBiGram();
void ReadMonoGram(double &);
void ReadBiGram(double &);
void CreateMonoGramAsync();
void CreateBiGramAsync();
};
xGramManipulator::xGramManipulator()
{
}
void xGramManipulator::CreateMonoGramAsync()
{
thread t(&xGramManipulator::ReadMonoGram, this);
}
void xGramManipulator::CreateBiGramAsync()
{
thread t = thread(&xGramManipulator::ReadBiGram, this);
}
上述代码(这两个异步成员函数)会产生以下错误:
错误消息:
错误C2661:'std :: thread :: thread':没有重载函数需要2个参数
答案 0 :(得分:4)
说std::thread(&myclass::function1, this)
。
如果需要消除重载的歧义,则必须明确地转换函数指针:
std::thread(static_cast<void (xGramManipulator::*)()>(&xGramManipulator::ReadMonoGram), this)
答案 1 :(得分:0)
尝试使用此处所述的boost :: bind来绑定成员函数的隐式“this”参数:
How to use boost bind with a member function
这将使它成为一个没有参数的函数,你可以用它来启动一个线程。