Как создать поток, используя нестатический метод в VC ++ MFC - PullRequest
4 голосов
/ 14 мая 2011

Я создаю поток, используя этот вызов:

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

read_data - это статический метод в моем классе.

Но я хочу вызвать нестатический метод и сделатьthread.

Поскольку я хочу разделить переменную между этим потоком и одним из методов моего класса.

Я попытался получить статическую переменную, но она выдавала некоторые ошибки.

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Я не буду повторять слова Мариуса, но добавлю, что я использую следующее:

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. Таким образом, мне удобнее иметь всех учеников, как я, в самом классе.

4 голосов
/ 14 мая 2011

Вы не можете создать поток, используя нестатический член функции в качестве процедуры потока: причина в том, что все нестатические методы класса имеют неявный первый аргумент, это указатель this.

Это

class foo
{
  void dosomething();
};

на самом деле

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

. Из-за этого сигнатура функции не совпадает с той, что вам нужна для процедуры потока.Вы можете использовать статический метод в качестве потоковой процедуры и передать ему указатель 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...