带有_beginthreadex的参数类型错误

时间:2012-07-02 08:07:28

标签: c++ multithreading arguments beginthreadex

要在我的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 *)不兼容。

我理解错误,但我真的不知道如何解决这个问题!

3 个答案:

答案 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