Ошибка типа аргумента с _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
обычно.