0

我有一门课,例如:

class MyStreamReader
{
public:
    MyStreamReader(MyPramameter myPram) {.....}
    ~MyStreamReader() {}

    DWORD WINAPI  ReaderThread(LPVOID *lpdwThreadParam ) 

    {

       //....
    }
};

我想用WinAPI CreateThread调用 ReaderThread 。但是 CreateThread 想要 ReaderThread 函数想要一个静态函数。

在某些形式中,据说这可以通过 boost 库实现,例如

CreateThread(NULL, 0, boost::bind(&MyStreamReader::ReaderThread,this),

(void*)&myParameterObject), 0, NULL);

但是我得到了编译错误:

'CreateThread' : cannot convert parameter x from 'boost::_bi::bind_t<R,F,L>' 

to 'LPTHREAD_START_ROUTINE'

因此,我的问题是:

  1. 是否可以使用 boost lib(或任何其他方法)从 CreateThread 调用类的非静态函数
  2. 如果没有任何 C++ 线程库,您可以推荐(对于可视化 C++),我可以调用运行类的非静态成员函数作为线程?

最好的祝愿

更新:

所以第一个问题:似乎不可能从 CreateThread win API 调用非静态 c++ 成员函数......

因此,对于 C++ 多线程库的任何建议都可以将非静态函数调用为线程......

更新2: 好吧,我尝试提升线程库......似乎它有效......

MyStreamReader* streamReader = new MyStreamReader(myParameters);


boost::thread GetStreamsThread

   ( boost::bind( &MyStreamReader::ReaderThread, streamReader ) );

或(无需绑定)

boost::thread GetStreamsThread(&MyStreamReader::ReaderThread, streamReader);

并且为了使用 boost::thread 我将我的类定义更新为:

class MyStreamReader
  {
    public:
        MyStreamReader(MyPramameter myPram) {.....}
        ~MyStreamReader() {}

        void ReaderThread()
        {

           //....
        }
  };
4

1 回答 1

2

对此的一个常见答案是使用静态“thunk”:

class Worker
{
    public :
        static DWORD Thunk(void *pv)
        {
            Worker *pThis = static_cast<Worker*>(pv);
            return pThis->DoWork();
        }

        DWORD DoWork() { ... }
};

...

int main()
{
    Worker worker;
    CreateThread(NULL, 0, &Worker::Thunk, &worker);
}

当然,您可以将更多参数打包到对 pv 的调用中。只需让您的 thunk 将它们正确分类即可。

为了更直接地回答您的问题, boost::bind 不适用于 Winapi。我建议改用 boost::thread,它确实适用于 boost::bind(或者,如果你有 C++0x 编译器,请使用 std::thread 和 std::bind)。

于 2011-07-27T08:43:58.300 回答