2012-06-15 2 views
13

可能な重複を:
Start thread with member functionはstdするメンバ関数を渡す::スレッド

私は最近、C++ 11とIで新しいのstd ::スレッドライブラリで遊んでてきました問題を見つけた私はクラスを渡すためにしようとすると、新しいスレッドに機能し、それは私にエラーを与えます(私は家から離れてイムので、今の正確なエラーテキストを持っていけない) 私は何午前、この

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

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

のようなクラスを持っていました私は間違っている?

+1

uはFunctA/FunctBの静的を作ってみましたか? –

答えて

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

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

メンバー関数へのポインターは、関数へのポインターとは異なり、呼び出す構文も異なります。また、classのインスタンスが必要です。 std::threadコンストラクタの2番目の引数としてインスタンスへのポインタを渡すことができます。

+1

argsがあればどうなりますか?どのようにそれらを渡すだろうか? – kdubs

+0

@kdubs:...コンストラクタ呼び出しのさらなる引数として。将来はドキュメントを読んでください。 – Griwes

+0

このコードは失敗します!たとえあなたが 'public'キーワードを追加しても。 –

0

私は、問題は、関数に似た方法でメンバ関数へのポインタを得ることができないと思います。 Hereこれについて詳しくは、こちらをご覧ください。

また、コンパイラエラーテキストを入力した場合は、回答するほうがはるかに簡単です。

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

それはダムです。スマートではありません。 – Griwes

+0

@Griwes:不必要に冗長ですが、動作する必要がありますので、私はdownvoteを保証するとは思わないです。 – ildjarn

+3

@ildjarn、右、多分downvoteの価値がないかもしれませんが、まだダムです。 – Griwes

関連する問題