_beginthreadex статическая функция-член - PullRequest
1 голос
/ 11 августа 2009

Как создать подпрограмму потока статической функции-члена

class Blah
{
    static void WINAPI Start();
};

// .. 
// ...
// ....

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);

Это дает мне следующую ошибку:

***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***

Что я делаю не так?

Ответы [ 5 ]

16 голосов
/ 11 августа 2009

Иногда полезно прочитать полученную ошибку.

cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'

Давайте посмотрим, что там написано. Для параметра три вы даете ему функцию с подписью void(void), то есть функцию, которая не принимает аргументов и ничего не возвращает. Он не может преобразовать это в unsigned int (__stdcall *)(void *), что _beginthreadex ожидает :

Ожидается функция, которая:

  • Возвращает unsigned int:
  • Используется stdcall соглашение о вызовах
  • Принимает void* аргумент.

Таким образом, мое предложение было бы "дать ему функцию с подписью, которую он запрашивает".

class Blah
{
    static unsigned int __stdcall Start(void*);
};
3 голосов
/ 11 августа 2009
class Blah
{
    static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};

Подпрограмма, переданная в _beginthreadex, должна использовать __stdcall соглашение о вызовах, а должна возвращать код завершения потока .

Реализация Blah :: Start:

unsigned int __stdcall Blah::Start(void*)
{
  // ... some code

  return 0; // some exit code. 0 will be OK.
}

Позже в своем коде вы можете написать следующее:

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);

В первом случае Function-to-pointer conversion будет применяться в соответствии со стандартом C ++ 4.3 / 1. Во втором случае вы передадите указатель на функцию неявно.

2 голосов
/ 11 августа 2009

Ниже приводится версия компиляции:

class CBlah
{
public:
    static unsigned int WINAPI Start(void*)
    {
    return 0;
    }
};

int main()
{
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);

    return 0;
}

Ниже приведены необходимые изменения:

(1). Функция Start () должна возвращать unsigned int

(2). В качестве параметра должна быть пустота *.

EDIT

Удалено (3) согласно комментарию

2 голосов
/ 11 августа 2009
class Blah
{
  public:
    static DWORD WINAPI Start(void * args);
};
1 голос
/ 11 августа 2009
class Blah
{
    static unsigned int __stdcall Start(void *);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...