2012-07-02 57 views
1

来定义我的主题我有我的头文件错误的参数类型与_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 *)不兼容。

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

+0

你在'PerformLogin'的定义开头缺少'HttpClient ::'。不过,添加后仍然会出现错误(如@hmjd),但至少会正确定义您的课程。 – eran

+0

@darkheir:参见http://stackoverflow.com/questions/1259815/beginthreadex-static-member-function了解使用带成员函数的_beginthreadex'的示例代码。 – tenfour

回答

2

一个可能的办法解决这一问题将是使成员函数static,虽然这意味着PerformLogin()没有this指针,必须的HttpClient非静态成员的访问权限。

另一种方法是将PerformLogin()共计从HttpClient中移出,并使其成为一项免费功能。

+0

我将尝试移动PerformLogin(),似乎是一个很好的解决方案! – darkheir

+1

@darkheir,你应该根据其他标准决定把你的函数放在哪里,比如考虑到OOP原则,它在你的模型中的属性。 –

2

我通常是增加“本”为void *的参数静态函数 - 那么你可以调用它的方法与位铸造的静态函数..

+0

这是多余的,请参阅我的回答 –

+0

这不是多余的。投向“this”比依靠调用惯例hackery更好。 – tenfour

+0

@tenfour,你说的拙劣,但我仍然认为隐含的“这个”方法更好。 –

0

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

因此,除去明确的说法:

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

并调用_beginthreadex,同时通过this作为参数:

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

值得一提的是,这是一个有点哈克。 C++常见问题advises against it。 我仍然喜欢这种方法。当然,我通常只使用boost::thread

相关问题