поток и статический член класса
От: ethan hunt  
Дата: 08.08.04 05:08
Оценка:
Господа,
извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
... << RSDN@Home 1.1.3 stable >>
Re: поток и статический член класса
От: Ovl Россия  
Дата: 08.08.04 06:50
Оценка:
Здравствуйте, ethan hunt, Вы писали:

EH>Господа,

EH>извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).

наверно потому что такую функцию можно запустить по ажресу не имея самого объекта под рукой
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: поток и статический член класса
От: Аноним  
Дата: 08.08.04 06:53
Оценка:
EH>Господа,
EH>извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).
Не совсем понятен вопрос. Если ты хочешь использовать функцию член в качестве потока, то она действительно должна быть static т.к. static функции не имееют this пойнтера.
Поток и функция-член класса
От: MaximE Великобритания  
Дата: 08.08.04 07:47
Оценка: 50 (15) -1 :)
#Имя: FAQ.cpp.threadandmember
ethan hunt wrote:

> Господа,

> извиняюсь за тупость, но почему в отдельный поток можно кидать только статическую функцию-член класса. До конца не понимаю (может из-за недосыпания).

Потому, что статическая функция-член имеет такой же тип, как и обычная ф-ция (в отличее от нестатической фун-ции-члена). В win32 и POSIX ф-ция создания потока принимает указатель именно на обычную ф-цию. Но это вовсе не значит, что ты не можешь направить поток в ф-цию-член, просто для этого тебе придется использовать переходник, который будет перенаправлять поток в функцию-член:

template<class T, DWORD(T::*mem_fun)()>
inline
DWORD WINAPI thread_to_member_thunk(void* p)
{
     return (static_cast<T*>(p)->*mem_fun)();
}


Используем:

struct some
{
     DWORD f() { return 0; }
};

int main()
{
     some s;
     // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
     CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
}


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 beta
Re[2]: поток и статический член класса
От: BuHHunyx Беларусь  
Дата: 02.12.04 14:09
Оценка: 6 (1)
Здравствуйте, MaximE, Вы писали:

ME>Потому, что статическая функция-член имеет такой же тип, как и обычная ф-ция (в отличее от нестатической фун-ции-члена). В win32 и POSIX ф-ция создания потока принимает указатель именно на обычную ф-цию. Но это вовсе не значит, что ты не можешь направить поток в ф-цию-член, просто для этого тебе придется использовать переходник, который будет перенаправлять поток в функцию-член:


ME>
ME>template<class T, DWORD(T::*mem_fun)()>
ME>inline
ME>DWORD WINAPI thread_to_member_thunk(void* p)
ME>{
ME>     return (static_cast<T*>(p)->*mem_fun)();
ME>}
ME>


ME>Используем:


ME>
ME>struct some
ME>{
ME>     DWORD f() { return 0; }
ME>};

ME>int main()
ME>{
ME>     some s;
ME>     // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
ME>     CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
ME>}
ME>


Попробывал скомпилять данный пример в VS6sp6

E:\Projects\test\test.cpp(31) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target type

Где грабли?
Re[3]: поток и статический член класса
От: MaximE Великобритания  
Дата: 02.12.04 16:47
Оценка:
BuHHunyx wrote:

[]

> Попробывал скомпилять данный пример в VS6sp6

>
> E:\Projects\test\test.cpp(31) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
> None of the functions with this name in scope match the target type
>
> Где грабли?

В допотопном компиляторе. http://rsdn.ru/Forum/?mid=136328
Автор: MaximE
Дата: 21.11.02


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re[2]: поток и статический член класса
От: Salex100 Россия  
Дата: 03.12.04 11:48
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>
ME>template<class T, DWORD(T::*mem_fun)()>
ME>inline
ME>DWORD WINAPI thread_to_member_thunk(void* p)
ME>{
ME>     return (static_cast<T*>(p)->*mem_fun)();
ME>}
ME>


ME>Используем:


ME>
ME>struct some
ME>{
ME>     DWORD f() { return 0; }
ME>};

ME>int main()
ME>{
ME>     some s;
ME>     // в качестве параметра (lpParam) передаем указатель на объект, чтобы переходник направил поток именно в этот объект
ME>     CreateThread(0, 0, thread_to_member_thunk<some, &some::f>, &s, 0, 0);
ME>}
ME>



Классная идея! Уже воплощаю ее в своей обертке.
Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)
Жизнь удалась!
Re[3]: поток и статический член класса
От: MaximE Великобритания  
Дата: 03.12.04 11:52
Оценка:
Salex100 wrote:

> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)


Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re[4]: поток и статический член класса
От: Вадим Никулин Россия Здесь
Дата: 03.12.04 12:02
Оценка: 33 (1)
Здравствуйте, MaximE, Вы писали:

ME>Salex100 wrote:


>> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)


ME>Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.


ME>--

ME>Maxim Yegorushkin

Боюсь, что для шаблонной функции никогда не будет multiple definition [3.2/5]
Re[5]: поток и статический член класса
От: MaximE Великобритания  
Дата: 03.12.04 13:43
Оценка: +2
Вадим Никулин wrote:

>>> Однако, боюсь оказаться занудой, но помойму смысла в директиве inline нет, т.к. функция передается в винду по указателю. (или я туплю?)

>
> ME>Действительно, вызов никогда не будет заинлайнен. inline — для того, чтобы можно было положить этот шаблон ф-ции в хедер и не было multiple symbol definition linker error.

> Боюсь, что для шаблонной функции никогда не будет multiple definition [3.2/5]


Да, точно, ты прав.

Но если ты полностью заспециализируешь шаблон ф-ции в хедере, то все-таки получишь multiple definition error, т.к. полные специализации ф-ций — это не шаблоны, а определения ф-ций. Поэтому, чтобы всегда быть на безопасной стороне, я автоматом пишу inline для function template.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re: Поток и функция-член класса
От: Аноним  
Дата: 08.06.07 18:53
Оценка:
А как можно через _beginthread запустить не статический член сласса?

очень срочно нужно, приведите пожалуйста пример.
Re[2]: Поток и функция-член класса
От: Кодт Россия  
Дата: 09.06.07 12:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А как можно через _beginthread запустить не статический член сласса?

А>очень срочно нужно, приведите пожалуйста пример.

Это
Автор: MaximE
Дата: 08.08.04
читал?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.