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 YegorushkinPosted via RSDN NNTP Server 1.9 beta