c++ - CreateThread 调用错误

标签 c++ multithreading

我想在一个类中启动一个线程,该线程将调用一个函数,该函数是同一类的成员。以下是我要构建的示例代码。

void CM::ExecuteIt()
{
// Some Calculations

if(/*Condition*/)
{
hThreadArray = CreateThread( 
                NULL,                   // default security attributes
                0,                      // use default stack size  
                MyThreadFunction,       // thread function name
                (LPVOID)&nProcessImage,          // argument to thread function 
                0,                      // use default creation flags 
                &dwThreadIdArray);
}
}

void CM::MyThreadFunction(LPVOID lpParam) 
    { 
    HANDLE hStdout;
    PMYDATA pDataArray;
// Some calculations that needs to be done
    }

但在构建它时出现以下错误 “错误 16 错误 C3867:‘CM::MyThreadFunction’:函数调用缺少参数列表;使用‘&CM::MyThreadFunction’创建指向成员的指针”

我不确定我是怎么做错的。有人可以帮我解决这个问题吗?

最佳答案

您不能将非静态成员传递给 CreateThread。您传递的函数必须是独立的非成员函数,或者是静态成员函数。一种常见的方法是这样的:

class MyClass {
  void StartThread() {
    CreateThread(..., ThreadProcTrampoline, this, ...);
  }

  static DWORD WINAPI ThreadProcTrampoline(LPVOID param) {
    MyClass* self = static_cast<MyClass*>(param);
    return self->RealThreadProc();
  }

  DWORD RealThreadProc();
};

任何你想传递给线程过程的数据,你都可以存储为类的数据成员。

或者,由于您将问题标记为 C++11,请使用 std::thread。您可以传递的内容更加灵活。

关于c++ - CreateThread 调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25094225/

相关文章:

java - 线程的问题

c++ - 如何以图形方式显示 .map 文件中的内存布局?

c++ - C++ 隐式类型何时初始化为 0?

java - publishOn 和并行的区别

c++ - 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?

sql - 选择 FOR UPDATE SKIP LOCKED 时,为什么行对多个 session 可见?

android - 如何将线程结果保存在数据库中

c++ - 为什么 C++11 中的统一初始化在虚拟基类中表现得很奇怪?

c++ - VB6 和 C++ bool 文字

c++ - 如何使用 umdh.exe 在所有堆中跟踪内存泄漏?