【问题标题】:Boost library and CreateThread win APIBoost 库和 CreateThread win API
【发布时间】:2011-10-14 00:55:32
【问题描述】:

我有一门课,例如:

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(或任何其他方法)创建线程
  2. 如果没有任何 C++ THREADing 库,您可以推荐(对于 Visual 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()
        {

           //....
        }
  };

【问题讨论】:

  • 远离CreateThread,如果你真的必须使用_beginthread_beginthreadex。这些功能太低级,无法处理线程。听听@Kaz Dragon。
  • @sad_man 为什么_beginthreadCreateThread 好?
  • @David: This 对我来说已经足够了,除非你有话要说。
  • @sad_man _beginthread 是非静态 c 函数的一个很好的替代方案,但在 C++ 成员函数方面很糟糕......
  • @sad_man 从CreateThread 创建的线程中使用 C 运行时的问题已在运行时的最新版本中得到修复。无论如何,这是一个可笑的限制。如果您想在由其他模块创建的线程中运行代码怎么办?

标签: multithreading winapi boost boost-thread createthread


【解决方案1】:

对此的一个常见答案是使用静态“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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多