C++ 是否使用类成员函数调用AfxBeginThread?

C++ 是否使用类成员函数调用AfxBeginThread?,c++,windows,multithreading,boost-bind,member-functions,C++,Windows,Multithreading,Boost Bind,Member Functions,如何使用任意非静态类方法调用AfxBeginThread?也许我能做点什么?下面是Microsoft的预期用法(这是调用非静态方法的示例,但硬编码为哪个方法): 您的代码示例很好。对于要在单独线程中调用的每个不同的非静态类方法,都需要一个线程函数 boost:bind对你没有任何帮助。。。AFXBuffic线程必须是C++模板函数,否则它不能与Booo::BIN或C++ 11 lambDas兼容。 一种替代方法是创建一个结构,为每个类/方法组合创建一个枚举,但这仍然需要为每个类/方法组合向枚举和

如何使用任意非静态类方法调用AfxBeginThread?也许我能做点什么?下面是Microsoft的预期用法(这是调用非静态方法的示例,但硬编码为哪个方法):


您的代码示例很好。对于要在单独线程中调用的每个不同的非静态类方法,都需要一个线程函数

boost:bind对你没有任何帮助。。。AFXBuffic线程必须是C++模板函数,否则它不能与Booo::BIN或C++ 11 lambDas兼容。 一种替代方法是创建一个结构,为每个类/方法组合创建一个枚举,但这仍然需要为每个类/方法组合向枚举和回调函数手动添加代码。然而,它的代码并不比为每个类/方法组合创建单独的线程函数少多少

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

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

template<class T>
UINT __cdecl StartThread(LPVOID pParam)
{
    return ((T*)pParam)->MyThreadProc();
}
模板
UINT\uuu cdecl开始线程(LPVOID pParam)
{
return((T*)pParam)->MyThreadProc();
}

我知道这个问题已经很老了,但它与我目前的情况很接近。我正在处理一个用VisualStudio2008项目编写的应用程序,希望避免使用所有的启动函数

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


我选择第二种选择。这在上面的问题中不起作用吗?

我没有boost bind的经验。你能把boost::bind对象作为参数传递给MyThreadProc,然后让MyThreadProc简单地调用boost绑定函数吗?@User:不行,因为你必须将boost::bind对象从LPVOID强制转换为实际对象,这并不简单,因为几乎每个boost::bind对象都有一个不同的(复杂的)参数类型。但是,您可以将boost::bind对象与boost::thread一起使用。考虑到我不知道您是否可以像Mark Ransom的回答中那样将boost::bind与模板化StartThread函数一起使用。@用户:可以,但您仍然必须将bind表达式的类型指定为模板参数,这非常麻烦,除非您可以使用C++11功能
auto
decltype
std::function
。否则您已经有了解决方案。你把它贴在问题上了。我想做的是在一个线程中执行一个任意的类成员函数,就像使用boost线程一样。我发布的示例可以工作,但它是硬编码到特定类的。我想使用boost thread,但在MFC上下文中使用它时似乎存在一些问题。您必须在占位符注释“do something with‘pObject’”的位置调用您的成员函数。对不起,事情就是这样。
boost::thread myFooFooThread( boost::bind( &Foo::Foo, myFooObject ) );
template<class T>
UINT __cdecl StartThread(LPVOID pParam)
{
    return ((T*)pParam)->MyThreadProc();
}