您的代码示例很好。对于要在单独的线程中调用的每个不同的非静态类方法,您都需要一个线程函数。
boost:bind 对您没有任何帮助... AfxBeginThread 必须是 C++ 模板函数,否则它不能与 boost::bind 或带有捕获的 C++11 lambda 兼容。
一种替代方法是创建一个结构,为您将拥有的每个类/方法组合使用一个枚举,但这仍然需要您手动将代码添加到每个类/方法组合的枚举和回调函数中。然而,它的代码并不比为每个类/方法组合创建一个单独的线程函数少多少。
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 ) );