Здравствуйте, Аноним, Вы писали:
А>Есть много книг где описываются threads, есть много книг где описываются классы, А>немогу понять можно ли создать thread используя функцию, член класса?
А>Например так:
А>_beginthreadex(NULL, 0, (void*)MyClass::FrameThreadProc, 0, 0, &thread); А>error C2664: '_beginthreadex' : А>cannot convert parameter 3 from 'int (void *)' to 'unsigned int (__stdcall *)(void *)'
А>или так:
А>_beginthreadex(NULL, 0, (unsigned)(void*)FrameThreadProc, 0, 0, &thread); А>error C2440: 'type cast' : А>cannot convert from 'int (__thiscall MyClass::* )(void *)' to 'void *'
На сколько я себе это представляю нет...
Для этого обычно используются функции фильтры (которые в классе обявляются как друзья)
или статические функции класса
class A;
void thread_filter(void* param)
{
A* a = (A*)param; a->Thread();
}
class A {
friend void thread_fileter(void* param);
private:
void Thread()
{
// тело потока
} ;
};
а потом создаем поток с функцией
thread_filter() передавая ей в качестве параметра указатель на класс A,
то же самое можно провернуть и со статической функцией класса, но итог один
имеем поток в классе
Re: Функция член класса, функция потока?
От:
Аноним
Дата:
27.01.03 14:14
Оценка:
Функция член класса принимает скрытый параметр- указатель на класс, а ф-ция для создания потока- только VOID*, поэтому компилятор не пропустит попытку передать в ф-цию создания потока указатель на ф-цию член класса, так как она будет принимать 2 параметра. Можно решить проблему при помощи static или ф-ций друзей.
Здравствуйте, Аноним, Вы писали:
А>Есть много книг где описываются threads, есть много книг где описываются классы, А>немогу понять можно ли создать thread используя функцию, член класса?
А>Например так:
А>_beginthreadex(NULL, 0, (void*)MyClass::FrameThreadProc, 0, 0, &thread); А>error C2664: '_beginthreadex' : А>cannot convert parameter 3 from 'int (void *)' to 'unsigned int (__stdcall *)(void *)'
А>или так:
А>_beginthreadex(NULL, 0, (unsigned)(void*)FrameThreadProc, 0, 0, &thread); А>error C2440: 'type cast' : А>cannot convert from 'int (__thiscall MyClass::* )(void *)' to 'void *'
Функция потока может быть членом класса, но только статическим. Имя класса задаёт лишь область видимости этой функции.
Внутри функции видны только статические члены класса и глобальные функции/переменные. Чтобы увидеть члены конкретного экземпляра этого класса внутри функции потока, передай this в её параметр void, ну и приведи тип на входе в соответствие.
class A
{
public:
A(){};
virtual ~A(){};
BOOL StartThread();
....
protected:
int m_int;
....
private:
....
static UINT ThreadFn(LPVOID pParam);
}
BOOL A::StartThread()
{
HANDLE hThread = NULL;
DWORD dwId;
if( (hThread = ::CreateThread(NULL,0,ThreadFn,this,&dwId,0) != NULL )
return TRUE;
return FALSE;
}
UINT A::ThreadFn(LPVOID pParam)
{
A* pThis = (A*)pParam;
int test = pThis->m_int;
// Здесь что-то очень полезное :) return 0; //ExitCode
}