c++ - 在类中创建线程

标签 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);
 ...
}

编译后出现此错误:

error C3867: 'MyClass::ListenThread': function call missing argument list; use '&MyClass::ListenThread' to create a pointer to member

我做错了什么?

最佳答案

您必须将线程函数DWORD WINAPI ListenThread (LPVOID WorkContext);定义为该类的静态函数:

class MyClass 
{
public:
  static DWORD WINAPI ListenThread (LPVOID WorkContext);
}

没有对象实例就不可能调用成员函数。在您的情况下,this 只是一个参数,将在您现在的静态函数 ListenThread 中作为 WorkContext 传递。


作为另一种解决方案,您还可以考虑使用 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);

}

但这会两次使用对 this 的引用:作为调用函数的类的实例,以及作为参数 LPVOID WorkContext。也许在目前的情况下这很尴尬。

关于c++ - 在类中创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26207299/

相关文章:

c++ - 如何加载 .rssdk 文件作为 realsense sdk 的输入

java - 跨多个进程均匀分布数据库记录

c++ - 自定义类函数引起的内存错误

ruby - 数字1上的实例方法从何而来

c++ - glGenTextures 和 glGenSamplers 有什么区别?

C++警告如果在函数中重新声明成员变量

c++ - 什么时候停止读取文件?

python - 在多处理或多线程应用程序中保留 cpu 时间

python - PySerial 丢失数据

如果页面打开更改按钮类的 php 脚本