Ошибка типа аргумента с _beginthreadex

Чтобы определить мою тему, я имею в своем заголовочном файле:

class HttpClient
{
public:
    ...
    unsigned int __stdcall  PerformLogin(void*);
    ...

};

Тогда в моем файле cpp у меня есть:

unsigned int __stdcall PerformLogin(void*){
...
}

И для вызова этой темы я использую

hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, NULL, 0, &threadID );

Но у меня есть ошибка на &PerformLogin говоря это:

Аргументы типа unsigned int (__stdcall HttpClient::)(void) не совместимы с параметром unsigned int (__stdcall *) (void *).

Я понимаю ошибку, но я действительно не знаю, как это исправить!

3 ответа

Решение

Возможный способ исправить это - сделать функцию-член staticхотя это значит PerformLogin() не имеет this указатель и не будет иметь доступа к нестатическим членам HttpClient,

Другое, чтобы двигаться PerformLogin() снаружи HttpClient в целом, и сделайте это бесплатной функцией.

Обычно я добавляю 'this' в качестве параметра void* к статической функции - затем вы можете вызывать методы для нее в статической функции с небольшим кастом..

Функции-члены получают this указатель неявно в качестве первого параметра. Поэтому, если вы хотите запустить поток с функцией-членом класса, вы должны явно передать указатель на экземпляр класса в вашем вызове _beginthreadex,

Итак, удалите явный аргумент:

class HttpClient
{
    public:
    ...
    unsigned int __stdcall  PerformLogin();
    ...
};

И позвонить _beginthreadex во время прохождения this в качестве аргумента:

hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );

Стоит отметить, что это немного хакерски. C++ FAQ советует против этого. Я все еще предпочитаю такой подход. Конечно я просто использую boost::thread обычно.

Другие вопросы по тегам