Функция член класса, функция потока?
От: Аноним  
Дата: 26.01.03 10:08
Оценка:
Есть много книг где описываются 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 *'
Re: Функция член класса, функция потока?
От: feshman  
Дата: 26.01.03 10:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть много книг где описываются 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 или ф-ций друзей.
Re[2]: Функция член класса, функция потока?
От: wtom  
Дата: 27.01.03 17:05
Оценка:
F>class A;

F>void thread_filter(void* param)

F> {
F> A* a = (A*)param;
F> a->Thread(); // Токма тута компилятор тебя пошлет подальше — местами надо поменять
F> }

F>class A {

F> friend void thread_fileter(void* param);
F> private:
F> void Thread()
F> {
F> // тело потока
F> } ;
F> };
Не стоит переходить реку вброд, если известно только, что ее глубина (средняя) 4 фута.
Re: Функция член класса, функция потока?
От: _Rom_  
Дата: 27.01.03 17:54
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Есть много книг где описываются 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
}


Роман.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.