如何在vc ++ mfc中使用非静态方法创建线程

时间:2011-05-14 11:12:23

标签: visual-c++ mfc

我正在使用此调用创建一个线程:

m_pThread=AfxBeginThread(read_data,(LPVOID)hSerial);

read_data是我班上的静态方法。

但我想调用非静态方法并创建一个线程。

因为我想在这个线程和我的一个类方法之间共享一个变量。

我尝试了一个静态变量,但它给出了一些错误。

2 个答案:

答案 0 :(得分:4)

你不能使用函数的非静态成员创建线程作为线程过程:原因是类的所有非静态方法都有一个隐含的第一个参数,这就是指针。

class foo
{
  void dosomething();
};

实际上是

class foo
{
  void dosomething(foo* this);
};

因此,函数签名与线程过程所需的函数签名不匹配。您可以使用静态方法作为线程过程并将此指针传递给它。这是一个例子:

class foo
{
  CWindThread* m_pThread;
  HANDLE hSerial;

  static UINT MyThreadProc(LPVOID pData);

  void Start();
};

void foo::Start()
{
  m_pThread=AfxBeginThread(MyThreadProc,(LPVOID)this);
}

UINT foo::MyThreadProc(LPVOID pData)
{
  foo* self = (foo*)pData;

  // now you can use self as it was this

  ReadFile(self->hSerial, ...);

  return 0;
}

答案 1 :(得分:4)

我不会重复马吕斯所说的话,但会补充说我使用以下内容:

class foo
{
    CWindThread* m_pThread;
    HANDLE hSerial;

    static UINT _threadProc(LPVOID pData);
    UINT MemberThreadProc();

    void Start();
};

void foo::Start()
{
    m_pThread=AfxBeginThread(_threadProc,(LPVOID)this);
}

UINT foo::MyThreadProc(LPVOID pData)
{
    foo* self = (foo*)pData;
    //  call class instance member
    return self->MemberThreadProc();
}

UINT foo::MemberThreadProc()
{
    //  do work
    ReadFile(hSerial, ...);
    return 0;
}

每次在MFC应用程序中的类中使用线程时,我都会遵循此模式。这样我就可以方便地让所有成员像我在课堂上一样。