2012-06-15 13 views
13

Powiel możliwe:
Start thread with member functionPrzechodząc funkcji członka do std :: wątek

Niedawno zostały gry z nowej biblioteki std :: wątku w C++ 11 i I natknąłem się na problem. Kiedy próbuję przekazać funkcję klas w nowym wątku, to daje mi błąd (nie mam dokładny tekst błędu w tej chwili, ponieważ im z dala od domu) miałem klasę jak ten

class A 
{ 
    void FunctA(); 
    void FunctB(); 

    void run() 
    { 
     std::thread t(FunctA); 
     std::thread r(FunctB); 
    } 
} 

co ja Robię źle?

+1

mieć u wypróbowany podejmowania FunctA/FunctB statyczny? –

Odpowiedz

26
class A 
{ 
    void FunctA(); 
    void FunctB(); 

    void run() 
    { 
     std::thread t(&A::FunctA, this); 
     std::thread r(&A::FunctB, this); 
    } 
}; 

Wskaźniki do funkcji składowych różnią się od wskaźników do funkcji, składnia nazywając je różni, jak również i wymaga instancję klasy. Możesz po prostu przekazać wskaźnik do instancji jako drugi argument konstruktora std::thread.

+1

co jeśli mają argumenty? jak byś je minął? – kdubs

+0

@kdubs: ... jako dalsze argumenty wywołania konstruktora. Proszę przeczytać dokumentację w przyszłości. – Griwes

+0

Ten kod nie działa! nawet jeśli dodasz słowo kluczowe 'public' .. –

0

Myślę, że problemem jest to, że nie można uzyskać wskaźnika do funkcji elementu w sposób podobny do funkcji. Here znajdziesz więcej informacji na ten temat.

Byłoby znacznie łatwiej odpowiedzieć, jeśli podałeś tekst błędu kompilatora.

2
class A 
{ 
    public: 
    A(FunctA &fa) : fa(fa) {} 

    struct FunctA 
    { 
     virtual void operator()() = 0; 
    } 
    struct FunctB 
    { 
     void operator()() 
     { 
     // thread B 
     } 
    } 
    FunctA &fa; 
    FunctB fb; 

    void run() 
    { 
     std::thread t(fa); 
     std::thread r(fb); 
    } 
} 

boost documentation

+0

To głupie. Jak w: nie sprytny. – Griwes

+0

@Griwes: Jest niepotrzebnie rozwlekły, ale to powinno działać, więc nie sądzę, że to uzasadnia. – ildjarn

+3

@ildjarn, racja, może nie warte spadku, ale wciąż głupie. – Griwes

Powiązane problemy