在类中创建线程

时间:2014-10-05 21:15:06

标签: c++ multithreading class

下面是我的部分代码:

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;创建指向成员的指针

我做错了什么?

1 个答案:

答案 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。在这种情况下,也许它很尴尬。