-2

スレッドを使用してメンバー関数のいくつかを呼び出そうとしています。これを持っているとします

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);
}

上記のコード (これら 2 つの Async メンバー関数) は、次のエラーを生成します:
エラー メッセージ:

エラー C2661: 'std::thread::thread': 2 つの引数を取るオーバーロードされた関数はありません

4

2 に答える 2

4

と言うstd::thread(&myclass::function1, this)

オーバーロードを明確にする必要がある場合は、関数ポインターを明示的にキャストする必要があります。

std::thread(static_cast<void (xGramManipulator::*)()>(&xGramManipulator::ReadMonoGram), this)
于 2013-07-26T11:13:48.460 に答える
0

ここで説明されているように boost::bind を使用して、メンバー関数の暗黙の「this」パラメーターをバインドしてみてください。

メンバー関数でブースト バインドを使用する方法

これにより、パラメーターのない関数になり、それを使用してスレッドを開始できます。

于 2013-07-26T11:14:06.157 に答える