Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有_beginthreadex的参数类型错误_C++_Multithreading_Arguments_Beginthreadex - Fatal编程技术网

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,关于黑客性你是对的,但我仍然认为隐式
这个
方法更好。