我如何在同一个类(C ++,MFC)中调用工作线程?

时间:2011-01-13 15:13:32

标签: c++ mfc

这是我的代码,其中包含错误:

void ClassA::init()
{
    HANDLE hThread;
    data thread;          // "thread" is an object of struct data

    hThread = CreateThread(NULL, 0, C1::threadfn, &thread, 0, NULL);
}

DWORD WINAPI ClassA::threadfn(LPVOID lpParam)
{   
    data *lpData = (data*)lpParam;
}

错误:

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

使工作线程在单个类中工作的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

线程创建函数不了解C ++类;因此,您的线程入口点必须是静态类成员函数或非成员函数。您可以将this指针作为lpvThreadParam参数传递给CreateThread()函数,然后让静态或非成员入口点函数通过该函数调用threadfn()函数指针。

如果threadfn()函数 是静态的,请确保将&放在C1::threadfn之前。

这是一个简单的例子:

class MyClass {
  private:
    static DWORD WINAPI trampoline(LPVOID pSelf);
    DWORD threadBody();
  public:
    HANDLE startThread();
}

DWORD WINAPI MyClass::trampoline(LPVOID pSelf) {
  return ((MyClass)pSelf)->threadBody();
}

DWORD MyClass::threadBody() {
  // Do the actual work here
}

HANDLE MyClass::startThread() {
  return CreateThread(NULL, 0, &MyClass::trampoline, (LPVOID)this, 0, NULL);
}

答案 1 :(得分:1)

根据标签你正在使用MFC。 CreateThread是Win32 C API,您应该改为CWinThread

答案 2 :(得分:0)

遵循警告错误中的建议,如果成员函数threadfnstatic,则此方法应该有效。

答案 3 :(得分:0)

如果您执行错误说明会发生什么?

CreateThread(NULL, 0, &C1::threadfn, &thread, 0, NULL);  // now passing pointer

这假设threadfn()是静态的。