要在我的Header文件中定义我的线程:
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类型的args(__stdcall HttpClient :: )(void )与param unsigned int(__stdcall *)(void *)不兼容。
我理解错误,但我真的不知道如何解决这个问题!
答案 0 :(得分:2)
解决此问题的一种可能方法是使成员函数static
,但这意味着PerformLogin()
没有this
指针,并且无法访问非静态成员HttpClient
。
另一种方法是将PerformLogin()
完全移出HttpClient
,并使其成为免费功能。
答案 1 :(得分:2)
我通常要将'this'作为void *参数添加到静态函数中 - 然后你可以在静态函数中调用方法并进行一些转换..
答案 2 :(得分:0)
成员函数隐式地将this
指针作为第一个参数。
因此,如果要使用类成员函数启动线程,则应在调用_beginthreadex
时显式传递指向类实例的指针。
所以,删除显式参数:
class HttpClient
{
public:
...
unsigned int __stdcall PerformLogin();
...
};
在传递_beginthreadex
作为参数时调用this
:
hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );
值得一提的是,这有点笨拙。 C ++ FAQ advises against it。
我仍然喜欢这种方法。当然我通常只使用boost::thread
。