2014-09-02 35 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