Несовместимость аргументов функции в классе
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 шт):
Функция _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. пишу в два часа ночи, мог где-то наплужить, пусть поправят где.