コードサンプルは問題ありません。個別のスレッドで呼び出したい非静的クラス メソッドごとに、スレッド関数が必要になります。
boost:bind はまったく役に立ちません... AfxBeginThread は C++ テンプレート関数である必要があります。そうしないと、boost::bind または C++11 ラムダとキャプチャと互換性がありません。
代替手段の 1 つは、クラスとメソッドの組み合わせごとに列挙型を使用して構造体を作成することですが、それでもクラスとメソッドの組み合わせごとに列挙型とコールバック関数の両方に手動でコードを追加する必要があります。ただし、クラス/メソッドの組み合わせごとに個別のスレッド関数を作成するよりも、それほどコードは少なくありません。
struct ThreadData
{
LPVOID object;
enum ObjectCallType {
Foo_Foo,
Foo_Bar
} objectCallType;
LPVOID* param;
ThreadData( LPVOID pobject, ObjectCallType poct, LPVOID* pparam=0 )
:object(pobject), objectCallType(poct), param(pparam) {}
};
UINT MyThreadProc( LPVOID pParam )
{
TheadData* thData = (ThreadData*)pParam;
try
{
switch( thData->objectCallType )
{
case ThreadData::Foo_Foo:
Foo* foo = (Foo*)thData->object;
foo->foo();
break;
case ThreadData::Foo_Bar:
Foo* foo = (Foo*)thData->object;
foo->bar( thData->param );
break;
default:
throw std::exception("unhandled method call type");
}
}
catch( std::exception& e )
{
std::cerr << e.what() << std::endl;
delete thData;
return 1;
}
delete thData;
return 0;
}
//usage:
AfxBeginThread(MyThreadProc, new ThreadData(myFooObject,ThreadData::Foo_Bar,myFooCallParam));
ブーストの例 (未テスト):
boost::thread myFooFooThread( boost::bind( &Foo::Foo, myFooObject ) );