Intereting Posts
Зачем мне включать предварительно скомпилированный заголовок во все файлы на C ++? Итерирование аргументов макроопределений Как эффективно умножить диапазон значений массива с заданным числом? Почему предпочтительнее использовать конструктор std :: initializer_list при использовании скопированного списка инициализаторов? MPI C ++ – изменение ранга templated operator () перегрузка C ++ Шаблон замены петли Как нарисовать текст с прозрачным фоном с помощью c ++ / WinAPI? Как вы можете использовать CaptureStackBackTrace для захвата стека исключений, а не вызывающего стека? Как быстро std :: swap для целых типов? || vs или ключевые слова CodeBlocks: как создать приложение C ++ с помощью библиотеки библиотек wxWidgets Как я могу стать главным другом моего classа? Разница между int * array и int array в параметре функции C ++ Многострочные комментарии с использованием обратной косой черты

Статическая функция члена _beginthreadex

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

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 *)'*** 

Что я делаю неправильно?

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

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

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

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

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

    Поэтому мое предложение было бы «дать ему функцию с подписью, которую она просит».

     class Blah { static unsigned int __stdcall Start(void*); }; 
     class Blah { static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it. }; 

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

    Реализация Blah :: Начало:

     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 ++ Standard 4.3 / 1. Во втором случае вы будете пропускать указатель на функцию неявно.

     class Blah { public: static DWORD WINAPI Start(void * args); }; 

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

     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). Он должен принимать значение void *.

    РЕДАКТИРОВАТЬ

    Удаленная точка (3) в соответствии с комментарием

     class Blah { static unsigned int __stdcall Start(void *); };