用类成员函数调用AfxBeginThread?

我如何用任意的非静态类方法调用AfxBeginThread? 也许有一些我可以做的提升绑定 ? 以下是Microsoft的预期用法(并且是调用非静态方法的一个示例,但它是硬编码的方法):

UINT MyThreadProc( LPVOID pParam ) { CMyObject* pObject = (CMyObject*)pParam; if (pObject == NULL || !pObject->IsKindOf(RUNTIME_CLASS(CMyObject))) return 1; // if pObject is not valid // do something with 'pObject' return 0; // thread completed successfully } // inside a different function in the program ... pNewObject = new CMyObject; AfxBeginThread(MyThreadProc, pNewObject); 

您将需要一个静态函数传递给AfxBeginThread,但它可以是一个非常简单的函数调用对象。 这是一个未经测试的模板功能,可能工作。

 template<class T> UINT __cdecl StartThread(LPVOID pParam) { return ((T*)pParam)->MyThreadProc(); } 

你的代码示例没有问题。 您将需要一个线程函数为每个不同的非静态类方法,你想在不同的线程中调用。

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

我知道这个问题已经很老了,但这与我目前的情况很接近。 我正在使用Visual Studio 2008项目编写的应用程序,并希望避免所有的启动功能。

我发现有两个不同的AfxBeginThread调用:一个需要启动函数(用于启动工作线程); 另一个需要从CWinClass派生一个类作为其第一个参数,并用于创建用户界面连接的对象和工作线程。

我正在选择第二个选项。 这不会在上述问题中工作吗?