1

要定义我的头文件中的线程:

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*) 不兼容。

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

4

3 回答 3

2

解决此问题的一种可能方法是创建成员函数static,尽管这意味着PerformLogin()没有this指针并且无法访问 的非静态成员HttpClient

另一种是完全搬出PerformLogin()HttpClient并使其成为免费功能。

于 2012-07-02T08:09:51.183 回答
2

我通常要做的是将“this”作为 void* 参数添加到静态函数 - 然后您可以在静态函数中调用它的方法,并进行一些转换。

于 2012-07-02T08:40:03.743 回答
0

成员函数this隐式获取指针作为第一个参数。所以如果你想用一个类成员函数启动一个线程,你应该在调用中显式传递一个指向类实例的指针_beginthreadex

因此,删除显式参数:

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

并在作为参数_beginthreadex传递时调用:this

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

值得一提的是,这有点 hacky。C++ FAQ建议不要这样做。我还是更喜欢这种方法。当然我只是boost::thread平时用。

于 2012-07-02T10:22:24.143 回答