C++ 带有_beginthreadex的参数类型错误
要定义头文件中的线程,请执行以下操作:C++ 带有_beginthreadex的参数类型错误,c++,multithreading,arguments,beginthreadex,C++,Multithreading,Arguments,Beginthreadex,要定义头文件中的线程,请执行以下操作: class HttpClient { public: ... unsigned int __stdcall PerformLogin(void*); ... }; 在我的cpp文件中,我有: unsigned int __stdcall PerformLogin(void*){ ... } 我用这个线程来命名 hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLog
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(u stdcall HttpClient::)(void)的参数与参数unsigned int(u stdcall*)(void*)不兼容
我理解这个错误,但我真的不知道如何修复它 解决此问题的一种可能方法是使成员函数
静态
,尽管这意味着PerformLogin()
没有此
指针,并且无法访问HttpClient
的非静态成员
另一种方法是将
PerformLogin()
从HttpClient
中移出,使其成为一个自由函数。解决此问题的一种可能方法是使成员函数为静态的
,尽管这意味着PerformLogin()
没有此
指针,无法访问HttpClient的非静态成员
另一种方法是将PerformLogin()
从HttpClient
中移出,我通常的做法是将'this'作为void*参数添加到静态函数中-然后您可以在静态函数中调用它的方法,只需进行一些转换。我通常的做法是将'this'作为void*参数添加到静态函数中-然后您可以使用转换位..成员函数将此指针隐式地作为第一个参数。
因此,如果希望用类成员函数启动线程,则应在调用\u beginthreadex
时显式传递指向类实例的指针
因此,删除显式参数:
class HttpClient
{
public:
...
unsigned int __stdcall PerformLogin();
...
};
hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );
并调用\u beginthreadex
,同时将此
作为参数传递:
class HttpClient
{
public:
...
unsigned int __stdcall PerformLogin();
...
};
hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );
值得一提的是,这是一个有点黑客。C++常见问题解答。
我还是喜欢这种方法。当然,我通常只使用boost::thread
。成员函数将这个指针隐式地作为第一个参数。
因此,如果希望用类成员函数启动线程,则应在调用\u beginthreadex
时显式传递指向类实例的指针
因此,删除显式参数:
class HttpClient
{
public:
...
unsigned int __stdcall PerformLogin();
...
};
hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );
并调用\u beginthreadex
,同时将此
作为参数传递:
class HttpClient
{
public:
...
unsigned int __stdcall PerformLogin();
...
};
hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );
值得一提的是,这是一个有点黑客。C++常见问题解答。
我还是喜欢这种方法。当然,我通常只使用boost::thread
。我将尝试将PerformLogin()移出,这似乎是一个很好的解决方案@darkheir,您应该根据其他标准来决定将函数放在何处,比如考虑OOP原则,它在您的模型中属于何处。我将尝试将PerformLogin()移出,这似乎是一个很好的解决方案@darkheir,您应该根据其他标准来决定将函数放在何处,比如考虑OOP原则,它在您的模型中属于何处。您缺少了HttpClient::
在PerformLogin
定义的开头。不过,添加类(如@hmjd所述)后仍然会出现错误,但至少类的定义是正确的。@darkheir:有关将\u beginthreadex
与成员函数一起使用的示例代码,请参阅。您缺少PerformLogin
定义开头的HttpClient::
。添加类(如@hmjd所述)后仍然会出现错误,但至少类的定义是正确的。@darkheir:有关将\u beginthreadex
与成员函数一起使用的示例代码,请参阅。这是多余的,请参阅我的回答。这不是多余的。使用这个
比依赖于调用约定黑客要好。@tenfour,你关于黑客性的看法是对的,但我仍然认为隐式这个
方法更好。这是多余的,请看我的回答。这不是多余的。使用这个
比依赖于调用约定黑客要好。@tenfour,关于黑客性你是对的,但我仍然认为隐式这个
方法更好。