下面是我的部分代码:
class MyClass
{
...
HANDLE m_ListenThr;
DWORD WINAPI ListenThread (LPVOID WorkContext);
bool CreateListenThreads();
}
bool MyClass::CreateListenThreads()
{
...
m_ListenThr = CreateThread(NULL, 0, MyClass::ListenThread,(void*)this, 0,&dwThreadId);
}
DWORD WINAPI MyClass::ListenThread (LPVOID WorkThreadContext)
{
MyClass pThis = reinterpret_cast<MyClass*>(WorkThreadContext);
...
}
编译后我收到此错误:
错误C3867:&#39; MyClass :: ListenThread&#39;:函数调用缺少参数 列表;使用&#39;&amp; MyClass :: ListenThread&#39;创建指向成员的指针
我做错了什么?
答案 0 :(得分:2)
您必须将线程函数DWORD WINAPI ListenThread (LPVOID WorkContext);
定义为类的static
函数:
class MyClass
{
public:
static DWORD WINAPI ListenThread (LPVOID WorkContext);
}
如果没有对象实例,则无法调用成员函数。在您的情况下,this
只是一个参数,将在您现在的静态函数WorkContext
中作为ListenThread
传递。
<小时/> 作为另一种解决方案,您还可以考虑使用C ++ 11
std::bind
,以便根据您传递给CreateThread的函数创建一个函数对象。
那会是这样的 - 对不起我没有窗户以便检查这是否编译 - 但它给你的想法:
bool MyClass::CreateListenThreads()
{
using std::placeholders;
std::function <void (void*)> threadFunction = std::bind(&MyClass::ListenThread, *this, _1);
m_ListenThr = CreateThread(NULL, 0, threadFunction,(void*)this, 0,&dwThreadId);
}
但是这会使用两次引用:作为调用函数的类的实例,并作为参数LPVOID WorkContext。在这种情况下,也许它很尴尬。