Как я могу назвать рабочий поток в том же классе (C ++, MFC)? - PullRequest
2 голосов
/ 13 января 2011

Вот мой код, который содержит ошибку:

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 ]

5 голосов
/ 13 января 2011

Функции создания потоков не знают классов 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 голос
/ 13 января 2011

Вы используете MFC, в соответствии с тегами.CreateThread - это Win32 C API, вместо этого вы должны смотреть CWinThread.

0 голосов
/ 13 января 2011

Что произойдет, если вы сделаете то, что говорит ошибка?

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

Это предполагает, что threadfn() является статическим.

0 голосов
/ 13 января 2011

Следуйте указаниям в сообщении об ошибке предупреждения, тогда это должно работать, если функция-член threadfn имеет значение static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...