2014-09-02 81 views
1

我想要使用一个类的函数的std ::线程C++的std ::螺纹和方法类

后续的代码片段返回一个错误

MyClass *MyClass_ptr = new MyClass; 
MyClass_ptr->MyFunction(); // Works 

std::thread ThreadA(MyClass_ptr->MyFunction()); // Error here 
std::thread ThreadB(MyClass_ptr->MyOtherFunction()); // Error here 

我需要做一个线程与指向该类的特定指针:MyClass_ptr

那么,有没有办法使用该特定指针的那个类的方法?

如果它是有用的这里是与Microsoft Visual Studio 2013

#include "stdafx.h" 

#include <iostream> 
#include <thread> 

class MyClass 
{ 

public: 
    void MyFunction(); 
    void MyOtherFunction(); 

}; 

void MyClass::MyOtherFunction() 
{ 
    std::cout << "Inside MyOtherFunction" << std::endl; 
    std::cin.get(); 
} 

void MyClass::MyFunction() 
{ 
    std::cout << "Inside MyFunction" << std::endl; 
    std::cin.get(); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyClass *MyClass_ptr = new MyClass; 

    MyClass_ptr->MyFunction(); // Works 
    std::thread ThreadA(MyClass_ptr->MyFunction()); // Error here 
    std::thread ThreadB(MyClass_ptr->MyOtherFunction()); // Error here 


    delete MyClass_ptr; 
    MyClass_ptr = nullptr; 

    return 0; 
} 

回答

2

您需要通过在其成员函数将被调用的对象(记住,每一个非静态成员函数有一个隐含的this参数):

#include <thread> 

class MyClass 
{ 
    public: 
    void MyFunction(); 
    void MyOtherFunction(); 
}; 

int main() 
{ 
    MyClass *MyClass_ptr = new MyClass; 

    std::thread ThreadA(&MyClass::MyFunction, MyClass_ptr); 
    std::thread ThreadB(&MyClass::MyOtherFunction, MyClass_ptr); 
} 
0

是的,你需要使用绑定编译的全部代码。下面的例子是用于提升绑定,但你总是可以使用bind.You的C++ 11版本可以使用这样的

boost::thread t(boost::bind(&sommeclass::someMethod, ptr_instance_of_someclass,parameters_if_any)); 

所以你的情况这将是

boost::thread ThreadA(boost::bind(MyClass::MyFunction,MyClass_ptr)); 
+3

您不需要使用绑定。 – 2014-09-02 22:20:22

+0

Thx很大程度上代码 – Michele 2014-09-02 22:21:42

+0

确定uop决定传入参数 – Rajeshwar 2014-09-02 22:22:13

1

你可以使用一个闭合。

std::thread ThreadA([MyClass_ptr](){ 
    MyClass_ptr->MyFunction(); 
}); 
+0

封闭你的意思是拉姆达? (我对它的区别有点模糊) – nwp 2014-09-02 22:28:01

+0

闭包是捕获(关闭)状态的lambda。所以在这种情况下,我们捕获MyClass_ptr。我们通过制作指针的副本来做到这一点。你也可以通过引用来捕获。 – Paul 2014-09-02 22:30:52