2

boost :: threadのドキュメントから、次のようにすることでパラメータをスレッド関数に渡すことができるようです。

boost::thread* myThread = new boost::thread(callbackFunc, param);

しかし、私がこれを行うと、コンパイラは次のように文句を言います

オーバーロードされた関数は2つの引数を取りません

私のコード:

#include <boost/thread/thread.hpp>
void Game::playSound(sf::Sound* s) {
    boost::thread soundThread(playSoundTask, s);
    soundThread.join();
}

void Game::playSoundTask(sf::Sound* s) {
    // do things
}

私はOgre3dに付属しているブーストのコピーを使用していますが、これは非常に古い可能性があると思います。ただし、興味深いことに、thread.hppを調べたところ、2つ以上のパラメーターを持つコンストラクターのテンプレートがあります。

4

1 に答える 1

6

問題は、メンバー関数が暗黙の最初のパラメーターType*(Typeはクラスの型) を取ることです。これは、メンバー関数が型のインスタンスで呼び出されるメカニズムであり、追加のパラメーターをboost::threadコンストラクターに渡す必要があることを意味します。また、メンバー関数のアドレスを として渡す必要があります&ClassName::functionName

使用方法を説明するために、コンパイルと実行の小さな例を作成しました。

#include <boost/thread.hpp>
#include <iostream>

struct Foo
{
  void foo(int i) 
  {
    std::cout << "foo(" << i << ")\n";
  }
  void bar()
  {
    int i = 42;
    boost::thread t(&Foo::foo, this, i);
    t.join();
  }
};

int main()
{
  Foo f;
  f.bar();
}
于 2013-03-06T23:04:23.317 に答える