下面是我的代码的一部分:
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);
...
}
编译后出现此错误:
我做错了什么?
最佳答案
您必须将线程函数DWORD WINAPI ListenThread (LPVOID WorkContext);
定义为该类的static
函数:
class MyClass
{
public:
static DWORD WINAPI ListenThread (LPVOID WorkContext);
}
没有对象实例的情况下不能调用成员函数。在您的情况下,
this
仅是将在现在静态函数WorkContext
中作为ListenThread
传递的参数。作为另一个解决方案,您也可以考虑使用C++ 11
std::bind
来创建要传递给CreateThread的函数对象。那会是这样的-抱歉,我没有Windows以便检查它是否可以编译-但它为您提供了一个主意:
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的引用。在当前情况下,这可能很尴尬。