下面是我的代码的一部分:

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的引用。在当前情况下,这可能很尴尬。

09-30 09:11