Несовместимость аргументов функции в классе

class cycleSleep
{
     void set_event_thread(void* pParams)
    {
        while (true)
        {
            timer.SetAndWait();
            SetEvent(hEvent);
        }
    }

    cycleSleep()
    {

        _beginthread(set_event_thread, 0, NULL);// ошибка
        
    }

    ~cycleSleep()
    {

    }

private:
    HANDLE hEvent;
};

Хочу передать в _beginthread указатель на функцию set_event_thread, но компилятор ругается на несовместимость параметров: Ошибка E0167 аргумент типа "void (Time::cycleSleep::*)(void *pParams)" несовместим с параметром типа "_beginthread_proc_type" Не помогает даже явное преобразование к _beginthread_proc_type. Почему так происходит?


Ответы (1 шт):

Автор решения: LShadow77

Функция _beginthread() требует в первом параметре самостоятельную функцию или статический метод класса (который, по сути, тоже является самостоятельной функцией), а вы пытаетесь скормить ей обычный, не статический метод класса. Если вам обязательно нужно запустить этот метод в отдельном потоке, то это можно сделать через статический метод-обёртку (и да, в деструкторе не мешало бы поток заджойнить):

class cycleSleep
{
    static void set_event_thread_wrap(cycleSleep** ppCls);

    void set_event_thread()
    {
        while (true)
        {
            timer.SetAndWait(); //будем считать, что timer где-то объявлен
            SetEvent(hEvent);
        }
    }

    cycleSleep()
    {
        pThis = this;
        hEvent = CreateEvent(NULL,false,false,NULL);
        hThread = _beginthread((_beginthread_proc_type)set_event_thread_wrap, 0, (void*)&pThis);
    }

    ~cycleSleep()
    {
        WaitForSingleObject(hThread,INFINITE);
        CloseHandle(hThread);
    }

private:
    HANDLE hEvent;
    HANDLE hThread;
    cycleSleep* pThis;
};

void cycleSleep::set_event_thread_wrap(cycleSleep** ppCls)
{
    (*ppCls)->set_event_thread();
}

P.S. пишу в два часа ночи, мог где-то наплужить, пусть поправят где.

→ Ссылка