Расширение библиотеки и API Win CreateThread - PullRequest
0 голосов
/ 27 июля 2011

У меня есть такой класс:

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

    DWORD WINAPI  ReaderThread(LPVOID *lpdwThreadParam ) 

    {

       //....
    }
};

и я хочу вызвать ReaderThread с WinAPI CreateThread . Но 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. Можно ли вызывать нестатическую функцию класса из CreateThread с использованием boost lib (или любого другого метода)
  2. Если нет какой-либо библиотеки C ++ THREADing, вы можете порекомендовать (для Visual C ++), что я могу вызывать нестатическую функцию-член класса как поток?

С наилучшими пожеланиями

Обновление:

Итак, первый вопрос: кажется, что нельзя вызывать нестатическую функцию-член c ++ из winThid API CreateThread ...

Таким образом, любые рекомендации для многопоточной библиотеки C ++, которые могут вызывать нестатические функции как потоки ...

Обновление 2: Ну, я попробую увеличить поток lib ... кажется, это работает ...

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()
        {

           //....
        }
  };

1 Ответ

2 голосов
/ 27 июля 2011

Одним из распространенных ответов на это является использование статического "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).

...