0

私は次のようなクラスを持っています:

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

    DWORD WINAPI  ReaderThread(LPVOID *lpdwThreadParam ) 

    {

       //....
    }
};

そして、WinAPICreateThreadを使用してReaderThreadを呼び出したいと思いますしかし、CreateThreadはReaderThread関数が静的関数を必要としています。

いくつかの形式では、これは次のようなブーストライブラリで可能であると言われています

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 ++ THREADing librrayがない場合は、これを呼び出すことができます(ビジュアルC ++の場合)-クラスの非静的メンバー関数をスレッドとして実行しますか?

幸運をお祈りしています

アップデート:

したがって、最初の質問:CreateThreadwinAPIから非静的c++メンバー関数を呼び出すことは不可能であるようです...

したがって、C++マルチスレッドlibwhicの推奨事項は、非静的関数をスレッドとして呼び出すことができます...

更新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

これに対する一般的な答えの1つは、静的な「サンク」を使用することです。

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への呼び出しにさらに多くのパラメーターをパックすることができます。あなたのサンクにそれらを正しく分類させるだけです。

質問に直接答えるために、boost::bindはWinapiではそのようには機能しません。代わりにboost::threadを使用することをお勧めします。これは、boost :: bindで機能します(または、C ++ 0xコンパイラーを使用している場合は、std::threadとstd::bindを使用します)。

于 2011-07-27T08:43:58.300 に答える